最小工作示例:
import numpy as np
datatest = np.array([[1, 2, 3], [1, 1, 2], [3, 3, 3]])
def sumcols(data):
temp = np.empty(data.shape[0])
for i in range(data.shape[0]):
for j in range(data.shape[1]):
temp[i] += data[i,j]
return temp
sumcols(datatest)
datatest
是以下数组:
array([[1, 2, 3],
[1, 1, 2],
[3, 3, 3]])
我只是想对列(和/或行)中的值求和。
奇怪的部分。当我多次运行此函数(即 sumcols(datatest)
)时,每个结果都大于下一个结果。此值行为在不同的函数名称下仍然存在:
n [4]: def means(data):
...: temp = np.empty(data.shape[0])
...: for i in range(data.shape[0]):
...: for j in range(data.shape[1]):
...: temp[i] += data[i,j]
...: return temp
...:
In [5]: means(datatest)
Out[5]: array([6., 4., 9.])
In [6]: means(datatest)
Out[6]: array([12., 8., 18.])
In [7]: means(datatest)
Out[7]: array([18., 12., 27.])
In [8]: means(datatest)
Out[8]: array([24., 16., 36.])
In [9]: means(datatest)
Out[9]: array([30., 20., 45.])
In [10]: def sumcols(data):
...: temp = np.empty(data.shape[0])
...: for i in range(data.shape[0]):
...: for j in range(data.shape[1]):
...: temp[i] += data[i,j]
...: return temp
...:
In [11]: sumcols(datatest)
Out[11]: array([36., 24., 54.])
In [12]: sumcols(datatest)
Out[12]: array([42., 28., 63.])
In [13]: sumcols(datatest)
Out[13]: array([48., 32., 72.])
In [14]: sumcols(datatest)
Out[14]: array([54., 36., 81.])
In [15]: sumcols(datatest)
Out[15]: array([60., 40., 90.])
In [16]: sumcols(datatest)
Out[16]: array([66., 44., 99.])
In [17]: sumcols(datatest)
Out[17]: array([ 72., 48., 108.])
这是怎么发生的?我没有在函数内部或外部分配变量并且每次函数调用都会重置temp
变量。
编辑:
该问题似乎与 temp
变量被声明为空有关。如果我将 temp = np.empty(data.shape[0])
更改为 temp = np.zeros(data.shape[0])
,它可以正常工作。我正在向 numpy 开发人员提交问题,以检查这是否是所需的行为。
编辑2: 有人已经写了an issue 。正如预期的那样,这是期望的行为,不会改变。
tl;博士
仅当您显式提交结果时才使用 np.empty
进行初始化。
否则,请针对您的具体情况使用不同的初始化 (np.zeros
)。
最佳答案
想看一些更有趣的东西吗?如果将 sumcols
的定义更改为:
def sumcols(data):
temp = np.empty(data.shape[0])
temp2 = np.empty(data.shape[0])
for i in range(data.shape[0]):
for j in range(data.shape[1]):
temp2[i] += data[i,j]
return temp2
在运行原始定义几次后,您会注意到此函数将继续增加旧版本停止处的相同值。
似乎 numpy 在内存中有一个特定的区域,在为新变量分配内存时它总是喜欢从该区域开始。如果您不断调用 np.empty
获取相同大小的数组,您将不断获得相同的内存块,从而获得相同的值,因为您没有首先对其进行初始化。
关于python - Numpy 函数输出随着每次运行而增加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60330687/