【发布时间】: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