簡體   English   中英

Python-Numpy:'維度依賴索引'

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

  • 您將如何使用a中的索引產生c?
  • 你有一個更好的好主意嗎?

正確的蒙版數組,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.

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