[英]pure numpy expression for selecting same-length subarrays with different starting indices from 3-D array
我有一個3-D numpy
數組(讓我們稱之為a
)形狀(74, 74, 4563)
,我想從前兩個維度的每個位置提取一個長度為n
子數組。 然而,這些子陣列中的每一個都在不同的位置開始,這取決於前兩個維度中的索引i
和j
。
例如,如果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.