說我有這個陣列
import numpy as np
a = np.array(
[
[[1,2], [3,4], [5,6]],
[[11,21], [31,41], [51,61]],
[[12,22], [32,42], [52,62]],
]
)
這兩個布爾掩碼
starts = array([[False, True, False],
[ True, False, False],
[ True, False, False]])
ends = array([[False, False, True],
[False, True, False],
[False, False, True]])
我想同時使用它們來索引a,以便合并每一行。這是想要的結果
array([[ 3, 4, 5, 6],
[11, 21, 31, 41],
[12, 22, 52, 62]])
我可以通過np.concatenate((a[starts], a[ends]), axis=1)
但我聽說concatenate與高級索引相比,它的計算效率不高。我有一種感覺,可以通過高級索引 重塑來獲得我想要的結果,因為我對同一個陣列進行了兩次索引,但我無法提出解決方案。
有沒有比計算更有效的方法來獲得我想要的結果np.concatenate((a[starts], a[ends]), axis=1)?
uj5u.com熱心網友回復:
使用高級索引和重塑我能做的最好的事情是
def foo(a,starts,ends):
I,J = [np.stack([i,j], axis=1) for i,j in zip(np.nonzero(starts),np.nonzero(ends))]
res = a[I,J]
return res.reshape(3,4)
In [123]: timeit np.concatenate((a[starts], a[ends]), axis=1)
16.3 μs ± 14.7 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [124]: timeit foo(a,starts,ends)
42.8 μs ± 105 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
在其他 SO 中,人們詢問組合多個切片,擔心“迭代”和連接。但另一種方法是將切片擴展為高級索引,并且只進行一次索引操作。一般來說,我有那些具有競爭力的替代品。
簡單的切片索引很快,因為創建了一個view- 一個具有自己的形狀和步幅的新陣列,但共享記憶體(資料緩沖區)。高級索引創建一個副本 - 如果陣列很大,這可能需要一些時間。連接還涉及復制 - 源陣列的所有元素都必須復制到結果中。您不想做的是一次又一次地復制這些元素。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/429103.html
上一篇:在反應中顯示陣列資料。輸出不來
