我有一个很大的numpy数组my_array
,我将其复制到另一个临时数组temp_my_array
中,以便在循环内的计算中使用它,如下所示:
my_array = [10.1, 20.3, ..., 11.2] # a large numpy array
temp_my_array = np.copy(my_array)
for i in range(200000):
for item in np.where(my_array> 5):
temp_my_array[item] = f(my_array[some other items])
my_array = np.copy(temp_my_array)
当np.copy
如此之大时,my_array
存在内存错误。此外,分析表明np.copy是我代码中最慢的部分。有什么想法吗?
答案 0 :(得分:2)
我建议你只复制实际改变的值。使用您的代码,这只是一个小小的改变:
my_array = [10.1, 20.3, ..., 11.2] # a large numpy array
temp_my_array = np.copy(my_array)
for i in range(200000):
inds = np.where(my_array > 5)
for item in inds:
temp_my_array[item] = f(my_array[some other items])
my_array[inds] = temp_my_array[inds]
否则你可以对你的函数进行向量化,但是如果[some other items]
依赖于你当前的索引,那么这可能会很烦人,如果它依赖于之前的my_array
结果,则可能是不可能的。
答案 1 :(得分:1)
听起来合理吗?批量分配到原始数组而不进行复制
my_array = [10.1, 20.3, ..., 11.2] # a large numpy array
for i in range(200000):
my_array[np.where(my_array>5)] = f(my_array[some other items]) # Mass assign instead of for-loop
您需要确保f()
现在返回一个数组。