簡體   English   中英

用於從3-D陣列中選擇具有不同起始索引的相同長度子陣列的純numpy表達式

[英]pure numpy expression for selecting same-length subarrays with different starting indices from 3-D array

我有一個3-D numpy數組(讓我們稱之為a )形狀(74, 74, 4563) ,我想從前兩個維度的每個位置提取一個長度為n子數組。 然而,這些子陣列中的每一個都在不同的位置開始,這取決於前兩個維度中的索引ij

例如,如果n=1000 ,我可能需要a[0, 0, 0:1000] ,還a[0, 1, 2:1002]等...我有一個ix0數組(稱為ix0 )這是一個2維數組,它告訴我每個子數組在每個i / j位置的起始位置。 最后,我保證不會有任何“溢出” -也就是說,在所有的值ix0 + n比的尺寸-2的長度小a (所以我們並不需要擔心,要求索引超出現有的范圍)。

例如...

a = np.arange(74*74*4563).reshape(74, 74, 4563)
ix0 = np.arange(74*74).reshape(74,74)/2 + 50
a[:, :, ix0:ix0+n]

哪個產生

IndexError: failed to coerce slice entry of type numpy.ndarray to integer

有沒有辦法在不循環遍歷所有i / j索引組合或創建大掩碼數組的情況下執行此操作?

之前已經問過這條線上的東西,但是2d。 我可能會試着看一下。

但這里是2d案例中發生的事情的簡單例子

In [1463]: x=np.arange(12).reshape(3,4)
In [1464]: ix0=np.array([0,2,1])
In [1465]: N=2

我們可以遍歷x每一行,收集所需的N長度切片,然后將它們連接到列表或數組中。 更普遍的問題是改變切片的長度,在這種情況下它們不能重新組裝成陣列。

In [1466]: [x[i,ix0[i]:ix0[i]+N] for i in range(3)]
Out[1466]: [array([0, 1]), array([6, 7]), array([ 9, 10])]

然后將該列表包裝在np.array

另一種方法是首先連接索引:

In [1467]: x[np.arange(3)[:,None], np.array([np.r_[ix0[i]:ix0[i]+N] for i in range(3)])]
Out[1467]: 
array([[ 0,  1],
       [ 6,  7],
       [ 9, 10]])

最后一個索引數組是:

In [1468]: np.array([np.r_[ix0[i]:ix0[i]+N] for i in range(3)])
Out[1468]: 
array([[0, 1],
       [2, 3],
       [1, 2]])

要應用於3d案例,我們有兩個選擇。 一個是重塑為2d,應用其中一個策略,並重新塑造。 另一個是概括我為創造這些所采取的行動 - 這不應該太難,但需要進行一些實驗。

最后一個數組不應該很難用廣播創建。

In [1469]: ix0[:,None]+np.arange(N)
Out[1469]: 
array([[0, 1],
       [2, 3],
       [1, 2]])

In [1470]: x[np.arange(3)[:,None], ix0[:,None]+np.arange(N)]
Out[1470]: 
array([[ 0,  1],
       [ 6,  7],
       [ 9, 10]])

現在應該更容易推廣到3d

In [1487]: X=np.arange(2*3*10).reshape(2,3,10)

In [1488]: ix0=np.arange(2*3).reshape(2,3)

In [1489]: ix0[...,None]+np.arange(N)
Out[1489]: 
array([[[0, 1],
        [1, 2],
        [2, 3]],

       [[3, 4],
        [4, 5],
        [5, 6]]])

In [1490]: I,J,_=np.ix_(range(2),range(3),range(N))

In [1491]: I.shape
Out[1491]: (2, 1, 1)

In [1492]: J.shape
Out[1492]: (1, 3, 1)

In [1493]: X[I, J, ix0[...,None]+np.arange(N)]
Out[1493]: 
array([[[ 0,  1],
        [11, 12],
        [22, 23]],

       [[33, 34],
        [44, 45],
        [55, 56]]])

我應該確保值是正確的,但形狀匹配,在這種情況下,這是80%的工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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