簡體   English   中英

用數組和切片對多個數組進行索引

[英]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]]

您說對了,這里的文檔可能不正確,或者至少缺少一些內容。 我為此提出了一個問題 ,以在文檔中進行澄清。

實際上,文檔的這一部分僅顯示了此示例,但是除此以外,您會被提出:

>>> y[np.array([0,2,4]), np.array([0,1])]
<type 'exceptions.ValueError'>: shape mismatch: objects cannot be
broadcast to a single shape

廣播更像:

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')是產生這些索引數組的另一種方法。

meshgridbroadcast_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM