pythonのnumpyを使った際スライスのコードで不明点があったので教えていただきたいです
X = data[:,1:3] # 2,3列目がデータ
調べて見ると、「行:列」でスライスができるという記述があったのですが、上記のコードでこのようなスライスが行われるのが理解できません
出力としては、全ての行から二列目と三列目が取得されています。
":"や","の意味やコードを文章で説明していただけたらありがたいです。
よろしくお願いいたします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
まず、
「行:列」でスライスができる
というのは間違った情報です、忘れてください。
はじめに:
の説明から。
pythonのリストやnumpy配列でのスライスは i:j:n
の形式で行います。
ここでi
は開始インデックス、 j
は終了インデックスを表しており、
i以上でjより小さいインデックス(i <= n < j)でスライスされます。
次に n
ですが、これはステップ数を表しますが、ステップ数は1の時は省略してi:j
のみの記述をすることができます。
ですので質問にある 1:3
は1以上で3より小さいインデックス値 ー (1,2)にスライスされることになります。
また、i
やj
の値も省略することが可能です。
i
が省略された場合は i = 0
が設定され、 jが省略された場合はj = (配列のサイズ)
が設定されます。
ですので
5:
インデックス値 5から最後まででスライス
:5
最初からインデックス値 4 まででスライス
:
最初から最後まで(配列全体)でスライス
ということになります。
最後に、,
の説明ですが、numpyでの2次行列の場合
data[行の指定,列の指定]
の記述にて行列から一部をスライスすることができます。
Python
1data[:,1:3]
は
行は :
(行全体)を指定
列は 1:3
インデックス(1,2)を指定
となります。
投稿2017/06/11 02:34
総合スコア15898
0
ご存知かもしれませんが、スライスはnumpyだけではなく、文字列やリストにも使う事が出来ます。
その中で[:]というのは、pythonにおいては、全ての要素を切り出すという事を意味します
python
1mozi = "ありがとうございます。" 2int_list = [1, 2, 3, 4, 5] 3 4print(mozi[:]) 5print(int_list[:])
実行結果
ありがとうございます。
[1, 2, 3, 4, 5]
今回提示されたコードでは、行を全て抜き出しているという事になります
python
1import numpy as np 2 3x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]]) 4 5print(x[:])
実行結果
[[1 2 3]
[3 2 1]
[2 3 1]]
そして次のスライスで、[1:3]と指定してるという事は、[:]で抽出された1番目から2番目の列の全てを抜き出すという事になります。
(3番目は含まないという仕様になっています)
python
1import numpy as np 2 3x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]]) 4 5print(x[:, 1:3])
実行結果
[[2 3]
[2 1]
[3 1]]
実行結果を見比べてみるとよくわかるかと思います
,の意味につきましてはただ単に区切りの意味を持っているだけかと
追記
python
1import numpy as np 2 3x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]]) 4 5print(x)
実行結果
[[1 2 3]
[3 2 1]
[2 3 1]]
配列の並びはこんな感じになっています
ここで一行目というのは[123]、二行目は[321]、3行目は[231]と横方向の並びを示します
一方、一列目というのは[132] 二列目は[223]、3列目は[311]と縦方向の並びを示します
1 2 3 列列列 目目目 一行目[[1 2 3] 二行目 [3 2 1] 三行目 [2 3 1]]
これを踏まえてまずは2行目から3行目をスライスしてみます。
ご存知でしょうが、pythonは、0番目からインデックスの指定が始まりますので
実際には、指定したい行数より1つ小さくなります
python
1import numpy as np 2 3x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]]) 4 5print(x[1:])
[1:]は1番目(二行目)から、後ろを全て切り出すという事です
実行結果
[[3 2 1]
[2 3 1]]
望み通り二行目と三行目を切り出す事が出来ました。
では次にここから、一列目だけを切り出してみます
1 2 3 列列列 目目目 一行目 [3 2 1] 二行目 [2 3 1]]
ここでは、[32]が1列目という事になりますね
python
1import numpy as np 2 3x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]]) 4 5print(x[1:,0:1])
実行結果
[[3]
[2]]
望み通り切り出せました。
[:,1:3]も同じ事です
[:]で全ての行を切り出した後、,で区切ってから、今度は[1:3]で1番目から2番目(2列目から3列目)の列を切り出すという事になります
投稿2017/06/10 09:29
編集2017/06/11 02:23退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2017/06/11 02:26
退会済みユーザー
2017/06/11 02:32
2017/06/11 02:43
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/06/11 02:41
2017/06/11 02:54
2017/06/11 13:26 編集