python - Numpy 函数输出随着每次运行而增加

标签 python arrays numpy

最小工作示例:

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/

相关文章:

python - Holoviews散点图的回归线?

java - 如何使用 Java 将数组参数设置为变量

python - 将 numpy 数组放入多处理队列的困难

python - 如何为 Python 3.6 安装 NumPy

python - 获取频率最大的类(python)

python - 句子中最常见的单词按类别分组

javascript - 绑定(bind)到过滤对象属性剔除嵌套 foreach

c++ - 调用 `strcat` 并能够将较大的字符串存储到较小的字符串中?

python - 如何拆分大数据并稍后重新加入

python - 将 concurrent.futures 与 Tornado 事件循环一起使用?