【问题标题】:How to efficiently concatenate Numpy Array based on position conditioning?如何根据位置条件有效地连接 Numpy Array?
【发布时间】:2020-10-22 10:41:31
【问题描述】:

目标是根据一组位置连接一个 Numpy 数组。但是,我很好奇concatenate和下面代码中显示的步骤是否可以在不需要for loop和if-else 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 

【问题讨论】:

  • 一般来说,重复concatenate(循环)不是一个好主意。它每次都会创建一个新数组,并带有完整副本。将值分配给预定义的数组,或使用列表追加。
  • 你好@hpaulj,你能解释更多或参考关于你的建议的好阅读材料predefined array

标签: python numpy for-loop if-statement


【解决方案1】:

我认为您的连接循环可以替换为:

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)

这里面可能有一些我没听懂的细节。我没有尝试测试它。列表追加比连接快得多,尤其是在重复执行时。
concatenate 在提供要加入的整个数组列表时最有效。

更好的是,根本不迭代;而是使用整个数组数学和索引。但是我没有尝试过掌握你的代码,所以不会建议如何去做。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多