簡體   English   中英

如何基於位置條件有效地連接 Numpy Array?

[英]How to efficiently concatenate Numpy Array based on position conditioning?

目標是根據一組位置連接一個 Numpy 數組。 但是,我很好奇下面代碼中顯示的concatenate和步驟是否可以在不需要for loopelse statement情況下進一步優化?

tot_length=0.2 implementation
steps=0.1
start_val=0
repeat_perm=3 
list_no =np.arange(start_val, tot_length, steps)
x, y, z = np.meshgrid(*[list_no for _ in range(3)], sparse=True)
ix = np.array(((x>=y) & (y>=z)).nonzero()).T
final_opt=list_no[ix]
final_opt[:,[0, 1]] = final_opt[:,[1, 0]] 
all_result=itertools.product(range(0,ix.shape[1]), repeat=repeat_perm)

for num, num_pair in enumerate(all_result, start=1):
    for num_x, num_pair_x in enumerate ( num_pair, start=0 ):
        if (num == 1) &(num_x==0) :
            cont_arry = final_opt [num_pair_x, :]
        else:
            cont_arry= np.concatenate((cont_arry, final_opt  [num_pair_x, :]), axis=0)

final_arr =np.reshape(cont_arry, (-1, 9))

print(final_arr)

大小(27, 9)輸出,但僅部分顯示如下

 [[0.  0.  0.  0.  0.  0.  0.  0.  0. ]
     [0.  0.  0.  0.  0.  0.  0.1 0.  0. ]
     [0.  0.  0.  0.  0.  0.  0.1 0.1 0. ]
     [0.  0.  0.  0.1 0.  0.  0.  0.  0. ]
     [0.  0.  0.  0.1 0.  0.  0.1 0.  0. ]
     [0.  0.  0.  0.1 0.  0.  0.1 0.1 0. ]
     [0.1 0.1 0.  0.1 0.1 0.  0.1 0.1 0. ]]

只需注意一下, cont_arry將向vectorised multiply長度與cont_arry相似的一1D數組。 知道了這一點,有沒有辦法避免將連接的結果存儲在內存中或者什么不能最小化潛在的內存問題,因為在實際應用中,最糟糕的參數設置如下

tot_length=200 
steps=0.1
start_val=0
repeat_perm=1200 

我認為您的連接循環可以替換為:

alist = []
for num, num_pair in enumerate(all_result, start=1):
    for num_x, num_pair_x in enumerate ( num_pair, start=0 ):
        alist.append( final_opt  [num_pair_x, :]))
arr = np.array(alist)
# arr = np.concatenate(alist, axis=0)
# arr = np.vstack(alist)

這里面可能有些細節我沒看懂。 我沒有試過測試它。 List append 比 concatenate 快得多,尤其是在重復執行時。
當給出要加入的整個數組列表時, concatenate是最有效的。

更好的是,根本不要迭代; 而是使用全數組數學和索引。 但我沒有嘗試掌握你的代碼,所以不會建議如何做到這一點。

暫無
暫無

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

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