[英]Numpy indexing multidimensional arrays with array and slice
我對numpy文檔中的此示例感到懷疑。
y = np.arange(35).reshape(5,7)
這是我要澄清的操作:
y[np.array([0,2,4]),1:3]
根據文檔:
“實際上,切片被轉換為索引數組np.array([[1,2]])(形狀(1,2)),並與索引數組一起廣播以產生形狀為(3,2 )“。
這行不通,所以我假設它不等效
y[np.array([0,2,4]), np.array([1,2])]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-140-f4cd35e70141> in <module>()
----> 1 y[np.array([0,2,4]), np.array([1,2])]
ValueError: shape mismatch: objects cannot be broadcast to a single shape
這個廣播的形狀數組(3,2)看起來如何?
Y [數據,的beginIndex:endIndex的]
import numpy as np
y = np.arange(35).reshape(5,7)
print(y)
[[ 0 1 2 3 4 5 6]
[ 7 8 9 10 11 12 13]
[14 15 16 17 18 19 20]
[21 22 23 24 25 26 27]
[28 29 30 31 32 33 34]]
print(y[np.array([0,2,4]),1:3])
[[ 1 2]
[15 16]
[29 30]]
廣播更像:
In [280]: y[np.array([0,2,4])[...,None], np.array([1,2])]
Out[280]:
array([[ 1, 2],
[15, 16],
[29, 30]])
我在[0,2,4]
添加了一個尺寸,使其變為2d。 broadcast_arrays
可用於查看廣播數組的外觀:
In [281]: np.broadcast_arrays(np.array([0,2,4])[...,None], np.array([1,2]))
Out[281]:
[array([[0, 0],
[2, 2],
[4, 4]]),
array([[1, 2],
[1, 2],
[1, 2]])]
np.broadcast_arrays([[0],[2],[4]], [1,2])
是相同的,沒有array
包裝器。 np.meshgrid([0,2,4], [1,2], indexing='ij')
是產生這些索引數組的另一種方法。
( meshgrid
或broadcast_arrays
產生的列表可以用作y[_]
的參數。)
所以說[1,2]
與索引數組一起廣播是正確的,但是它省略了有關調整尺寸的內容。
早些時候,他們有這個例子:
y[np.array([0,2,4])]
等效於y[np.array([0,2,4]), :]
。 它選擇3行,並從中選擇所有項目。 1:3
情況可以看作是對此的擴展,選擇3行,然后2列。
y[[0,2,4],:][:,1:3]
如果廣播過於混亂,這可能是考慮索引的一種更好的方法。
還有另一個文檔頁面可能會更好地處理此問題
http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html
在此文檔中,基本索引涉及切片和整數
y[:,1:3], y[1,:], y[1, 1:3]
高級索引涉及數組(或列表)
y[[0,2,4],:]
這產生與y[::2,:]
相同的結果,除了列表大小寫會產生副本(切片(基本)視圖)。
y[[0,2,4], [1,2,3]]
是純高級索引數組索引的情況,結果是3個項目,分別在(0,1)
, (2,2)
和(4,3)
。
y[[0,2,4], 1:3]
是這種情況,該文檔Combining advanced and basic indexing
,從'[0,2,4]'開始'高級',從'1:3'開始基本。
http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing
查看更復雜的索引數組可能會增加一些見識。
In [222]: i=[[0,2],[1,4]]
與另一個列表一起使用時,它是“純”高級的,並且廣播結果:
In [224]: y[i, [1,2]]
Out[224]:
array([[ 1, 16],
[ 8, 30]])
索引數組是:
In [234]: np.broadcast_arrays(i, [1,2])
Out[234]:
[array([[0, 2],
[1, 4]]),
array([[1, 2],
[1, 2]])]
[1,2]
列表僅擴展為(2,2)數組。
將其與切片一起使用是這種高級混合/基本混合的示例,結果為3d (2,2,2)
。
In [223]: y[i, 1:3]
Out[223]:
array([[[ 1, 2],
[15, 16]],
[[ 8, 9],
[29, 30]]])
與廣播等效的是
y[np.array(i)[...,None], [1,2]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.