リストで配列をスライスする


8

だから、私は派手な配列を作成します:

a = np.arange(25).reshape(5,5)

array([[0、1、2、3、4]、[5、6、7、8、9]、[10、11、12、13、14]、[15、16、17、17、18、19] 、[20、21、22、23、24]])

従来のスライスa[1:3,1:3]が戻る

配列([[6、7]、[11、12]])

2番目のリストを使用する場合と同様 a[1:3,[1,2]]

配列([[6、7]、[11、12]])

ただし、a[[1,2],[1,2]]返品

配列([6、12])

明らかに、私はここで何かを理解していません。とはいえ、リストを使用してスライスすることは、非常に役立つ場合があります。

乾杯、

ケン


されるa[[1,2],[1,2]]と言うことになってa[[1:2],[1:2]]?誤植はありa[1:3,[1,2]]ますか?それとも私は誤解していますか?
SherylHohman

回答:


2

いわゆるAdvanced Indexingの効果を確認しました。リンクからの例を考えてみましょう:

import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
print(x)
[[1 2]
 [3 4]
 [5 6]]
print(x[[0, 1, 2], [0, 1, 0]])  # [1 4 5]

これは、グリッドの(デカルト)座標のリストを提供すると考えることができます。

print(x[0,1])  # 1
print(x[1,1])  # 4
print(x[2,0])  # 5

0

最後のケースでは、2つの個別のリストは個別のインデックス付け操作として扱われます(これは実際には厄介な表現なので、ご容赦ください)。

Numpyは2つの整数の2つのリストを参照して、2つの値を要求していると判断します。各値の行インデックスは最初のリストから取得され、各値の列インデックスは2番目のリストから取得されます。したがって、とを取得a[1,1]a[2,2]ます。:表記は、あなたが正確に推定されてきたリストに展開するだけでなく、あなたがその範囲内のすべての行/列をしたいというnumpyのを伝えるだけではなく。

手動でキュレートしたリストインデックスを提供する場合、各リストまたは任意のリストのサイズは、取得する要素の数であるため、同じサイズにする必要があります。たとえば、行1、2、3の列1と2の要素が必要な場合:

>>> a[1:4,[1,2]]
array([[ 6,  7],
       [11, 12],
       [16, 17]])

だが

>>> a[[1,2,3],[1,2]]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: shape mismatch: indexing arrays could not be broadcast together with shapes (3,) (2,)

前者は後者は言いながら、「要素で私を得る、あなたが行と特定の列の範囲をしたいというnumpyのを伝え(1,1)(2,2)(3, hey! what the?! where's the other index?)


0

a[[1,2],[1,2]]これを読んでいるので、a [1,1]とa [2,2]が欲しい。これを回避する方法はいくつかあり、私はおそらく最善の方法さえ持っていませんが、あなたは試すことができます

a[[1,1,2,2],[1,2,1,2]]

これにより、上記のフラットバージョンが得られます。

a[[1,2]][:,[1,2]]

これにより、正しいスライスが得られます。行[1,2]、列[1,2]の順に機能します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.