質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

2933閲覧

python numpyのスライスについて

katsun

総合スコア18

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2017/06/10 06:57

編集2017/06/10 07:19

pythonのnumpyを使った際スライスのコードで不明点があったので教えていただきたいです

X = data[:,1:3] # 2,3列目がデータ

調べて見ると、「行:列」でスライスができるという記述があったのですが、上記のコードでこのようなスライスが行われるのが理解できません
出力としては、全ての行から二列目と三列目が取得されています。
":"や","の意味やコードを文章で説明していただけたらありがたいです。

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

まず、

「行:列」でスライスができる

というのは間違った情報です、忘れてください。

はじめに:の説明から。

pythonのリストやnumpy配列でのスライスは i:j:n の形式で行います。

ここでi は開始インデックス、 j は終了インデックスを表しており、
i以上でjより小さいインデックス(i <= n < j)でスライスされます。
次に n ですが、これはステップ数を表しますが、ステップ数は1の時は省略してi:jのみの記述をすることができます。

ですので質問にある 1:3 は1以上で3より小さいインデックス値 ー (1,2)にスライスされることになります。

また、ij の値も省略することが可能です。
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

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsun

2017/06/11 02:41

非常にわかりやすい説明ありがとうございます! すっきりしました! まだまだ学習を始めたばかりなので今後も質問させていただくことがあると思います。 また回答していただけたら幸いです。
katsun

2017/06/11 02:54

すみません ひとつ気になることがあったのですが、 最後に、, の説明ですが、numpyでの2次行列の場合 data[行の指定,列の指定] の記述にて行列から一部をスライスすることができます。 と、あるのですがこれは2次行列に限ったことなのですか? 3次行列などではどういった記述になるのでしょうか?
magichan

2017/06/11 13:26 編集

遅くなりました。NumpyにてN次配列のインデクシング・スライスを行う場合は data[exp1, exp2, ..., expN] で行うことができます。つまり3次元の場合は data[exp1,exp2,exp3]となります。
guest

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katsun

2017/06/11 00:36 編集

回答ありがとうございます。 ということは、[行:列]という認識は間違っているのでしょうか? 1:3で1列目と2列目を指定できることがイマイチ理解できません。
退会済みユーザー

退会済みユーザー

2017/06/11 02:26

[行:列]の認識はそれで合っているかと 正確には[行:行,列:列]ですが これで納得してもらえるかはわかりませんが、回答の方に追記しておきました
退会済みユーザー

退会済みユーザー

2017/06/11 02:32

もしかして、[行:列,行:列]と思っていたという事でしょうか? それならその認識は間違っていますね
katsun

2017/06/11 02:43

回答ありがとうございます! 私の認識がまちがっておりました わかりやすく例を示していただけて理解することができました! また質問させて頂いた際にも答えていただけたら幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問