Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy.copy阵列内存问题_Python_Arrays_Numpy - Fatal编程技术网

Python numpy.copy阵列内存问题

Python numpy.copy阵列内存问题,python,arrays,numpy,Python,Arrays,Numpy,我有一个大的numpy数组my_数组,我将它复制到另一个临时数组temp_my_数组,以便在循环内的计算中使用它,如下所示: 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[it

我有一个大的numpy数组
my_数组
,我将它复制到另一个临时数组
temp_my_数组
,以便在循环内的计算中使用它,如下所示:

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有内存错误。当
我的_数组太大时,复制
。此外,分析表明np.copy是我代码中最慢的部分。有什么想法吗?

这听起来合理吗?将质量指定给原始阵列而不制作副本

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()
立即返回数组。

我建议您只复制实际更改的值。对于您的代码,这只是一个微小的更改:

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]

否则,您可以对函数进行矢量化,但如果
[某些其他项]
依赖于您当前的索引,这可能会很烦人;如果它依赖于以前的
我的数组
结果,则不可能实现这一点。

我需要一份深度副本,这样,当我在
temp\u my\u array
中更改一个项目时,它不会在
my\u array
中更改相同的项目。对数组进行一次处理(您在第2行所做的操作),这将复制整个数组,即所有值,您可以随意更改所有值。对不起,我没有意识到您在函数调用中使用了
my\u array
中的值。在第二个for循环中,您不能只执行
my\u array[item]=f(my\u array[item])
而不处理临时数组吗?您用
np创建的迭代器。其中
不会引用循环中不断变化的
my_数组
。@Lærne您能再详细说明一下吗?这是一个有趣的解决方案!这种计算是在矢量化版本中进行的吗?如果
某些其他项
依赖于
my_array
的先前结果,那么您不能以这种方式进行矢量化,因此这实际上取决于其他项是什么。@BehzadJamali Yeah带有索引数组的赋值是用numpy进行矢量化的,所以这应该非常快。@AlexanderReynolds是的,这是真的,我假设它不是,因为它是来自其他地方的“其他项目”。我依赖于
my_array
的先前值。确实可以说,向量化将通过删除第二个循环来加速我的代码,但我仍然需要执行
my_array=np.copy(临时我的数组)