[英]Python - numpy : 'dimension dependent indexing'
我正在尋找一種優雅(快速)的解決方案來解決以下問題,以簡化繁重的實際情況。 答案可能不是numpy,而是我搜索了……
因此,假設我有 :
a = np.array([[2,7],
[3,6],
[2,8]])
讓我們假設一個假數據集:
b = np.random.random((3,10))
數組a中的行代表b的每一行中感興趣的子集的較高和較低的索引:“從b中的第一行開始,我對子集[2:7]感興趣,從第二行開始,我感興趣的子集子集[3:6],從第三行和最后一行開始是子集[2:8]。”
我現在的想法是創建一種遮罩數組c
c = np.array([0,0,1,1,1,1,1,1,0,0],
[0,0,0,1,1,1,1,0,0,0],
[0,0,1,1,1,1,1,1,1,0]])
然后我就繼續
d = b*c
而我不感興趣的元素現在為0。
正確的蒙版數組,np.ix_,扭曲的np.einsum,我找不到用於此目的的任何東西。 當然,整個過程的重點是避免在腳本可見部分的列表中循環。但這到底是可以避免的嗎?
非常感謝!
您可以通過broadcasting
創建蒙版-
n = b.shape[1]
mask = (np.arange(n) >= a[:,None,0]) & (np.arange(n) <= a[:,None,1])
d = mask*b
樣品運行-
In [252]: a
Out[252]:
array([[2, 4],
[3, 6],
[2, 3]])
In [253]: b
Out[253]:
array([[908, 867, 917, 649, 758, 950, 692],
[715, 745, 797, 595, 377, 421, 712],
[213, 143, 169, 825, 858, 780, 176]])
In [254]: n = b.shape[1]
...: mask = (np.arange(n) >= a[:,None,0]) & (np.arange(n) <= a[:,None,1])
...:
In [255]: mask
Out[255]:
array([[False, False, True, True, True, False, False],
[False, False, False, True, True, True, True],
[False, False, True, True, False, False, False]], dtype=bool)
In [256]: mask*b
Out[256]:
array([[ 0, 0, 917, 649, 758, 0, 0],
[ 0, 0, 0, 595, 377, 421, 712],
[ 0, 0, 169, 825, 0, 0, 0]])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.