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

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

ただいまの
回答率

90.35%

  • Python

    13375questions

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

  • Python 3.x

    11185questions

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

  • NumPy

    715questions

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

python numpyのスライスについて

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,358

katsun

score 12

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

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

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

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[行の指定,列の指定] 
の記述にて行列から一部をスライスすることができます。

data[:,1:3]


は : (行全体)を指定
は 1:3 インデックス(1,2)を指定
となります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/11 11:41

    非常にわかりやすい説明ありがとうございます!
    すっきりしました!

    まだまだ学習を始めたばかりなので今後も質問させていただくことがあると思います。
    また回答していただけたら幸いです。

    キャンセル

  • 2017/06/11 11:54

    すみません
    ひとつ気になることがあったのですが、

    最後に、, の説明ですが、numpyでの2次行列の場合
    data[行の指定,列の指定]
    の記述にて行列から一部をスライスすることができます。

    と、あるのですがこれは2次行列に限ったことなのですか?
    3次行列などではどういった記述になるのでしょうか?

    キャンセル

  • 2017/06/11 22:14 編集

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

    キャンセル

0

ご存知かもしれませんが、スライスはnumpyだけではなく、文字列やリストにも使う事が出来ます。
その中で[:]というのは、pythonにおいては、全ての要素を切り出すという事を意味します

mozi = "ありがとうございます。"
int_list = [1, 2, 3, 4, 5]

print(mozi[:])
print(int_list[:])

実行結果
ありがとうございます。
[1, 2, 3, 4, 5]

今回提示されたコードでは、行を全て抜き出しているという事になります

import numpy as np

x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]])

print(x[:])

実行結果
[[1 2 3]
[3 2 1]
[2 3 1]]

そして次のスライスで、[1:3]と指定してるという事は、[:]で抽出された1番目から2番目の列の全てを抜き出すという事になります。
(3番目は含まないという仕様になっています)

import numpy as np

x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]])

print(x[:, 1:3])

実行結果
[[2 3]
[2 1]
[3 1]]

実行結果を見比べてみるとよくわかるかと思います

,の意味につきましてはただ単に区切りの意味を持っているだけかと

追記

import numpy as np

x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]])

print(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つ小さくなります

import numpy as np

x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]])

print(x[1:])


[1:]は1番目(二行目)から、後ろを全て切り出すという事です

実行結果
[[3 2 1]
[2 3 1]]

望み通り二行目と三行目を切り出す事が出来ました。
では次にここから、一列目だけを切り出してみます

    1 2 3
       列列列
       目目目
一行目 [3 2 1]
二行目 [2 3 1]]

ここでは、[32]が1列目という事になりますね

import numpy as np

x = np.array([[1, 2, 3], [3, 2, 1], [2, 3, 1]])

print(x[1:,0:1])


実行結果
[[3]
[2]]

望み通り切り出せました。

[:,1:3]も同じ事です
[:]で全ての行を切り出した後、,で区切ってから、今度は[1:3]で1番目から2番目(2列目から3列目)の列を切り出すという事になります

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/06/11 09:33 編集

    回答ありがとうございます。
    ということは、[行:列]という認識は間違っているのでしょうか?

    1:3で1列目と2列目を指定できることがイマイチ理解できません。

    キャンセル

  • 2017/06/11 11:26

    [行:列]の認識はそれで合っているかと
    正確には[行:行,列:列]ですが

    これで納得してもらえるかはわかりませんが、回答の方に追記しておきました

    キャンセル

  • 2017/06/11 11:32

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

    キャンセル

  • 2017/06/11 11:43

    回答ありがとうございます!
    私の認識がまちがっておりました

    わかりやすく例を示していただけて理解することができました!
    また質問させて頂いた際にも答えていただけたら幸いです。

    キャンセル

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

  • ただいまの回答率 90.35%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Python

    13375questions

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

  • Python 3.x

    11185questions

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

  • NumPy

    715questions

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