如何实现 Numpy 数组的'+='?



我试图找出如何使用Numpy与Python连接数组使用类似于'+='的东西。然而,我在运行程序时遇到了一个操作数错误,这很令人困惑。

import numpy as np
a=np.array([])
for i in range(10):
    n=np.random.normal(1, 1, 10)
    a = a+n
print(a)

我该怎么做才能让它工作呢?这是一个非常简单的问题,但由于我不知道Numpy是如何工作的,它一直困扰着我。谢谢!

在建议修复之前,我们真的应该询问错误,并进行回溯。无论如何,这是你的完整错误:

In [83]: a=np.array([])
In [84]: n = np.random.normal(1,1,10)
In [85]: a.shape
Out[85]: (0,)
In [86]: n.shape
Out[86]: (10,)
In [87]: a+n
Traceback (most recent call last):
  Input In [87] in <cell line: 1>
    a+n
ValueError: operands could not be broadcast together with shapes (0,) (10,) 

尝试按元素顺序添加一个0元素数组和一个10元素数组。这不是操作数错误;一个是ValueError,一个是broadcasting。重要的是你要明白发生了什么。

但如果a以列表开始:

In [88]: a = []
In [89]: a.append(n)
In [90]: a
Out[90]: 
[array([0.73866347, 0.68341855, 1.14853292, 0.96903861, 0.28691117,
        1.20049352, 1.89670582, 0.92089883, 0.84876042, 0.79195955])]
In [91]: a.append(n)
In [92]: a
Out[92]: 
[array([0.73866347, 0.68341855, 1.14853292, 0.96903861, 0.28691117,
        1.20049352, 1.89670582, 0.92089883, 0.84876042, 0.79195955]),
 array([0.73866347, 0.68341855, 1.14853292, 0.96903861, 0.28691117,
        1.20049352, 1.89670582, 0.92089883, 0.84876042, 0.79195955])]

现在我们得到一个数组列表,可以用

将它们连接成一个数组:
In [93]: np.stack(a)
Out[93]: 
array([[0.73866347, 0.68341855, 1.14853292, 0.96903861, 0.28691117,
        1.20049352, 1.89670582, 0.92089883, 0.84876042, 0.79195955],
       [0.73866347, 0.68341855, 1.14853292, 0.96903861, 0.28691117,
        1.20049352, 1.89670582, 0.92089883, 0.84876042, 0.79195955]])

逐行填充数组,在速度上与列表追加方式竞争:

In [94]: arr = np.zeros((3,10))
    ...: for i in range(3):
    ...:     arr[i,:] = n

但是一次创建所有行更好:

In [97]: n = np.random.normal(1,1,(3,10))

下面是+=如何与数组一起使用:

In [99]: a = np.arange(5)
In [100]: a = np.arange(5)
In [101]: a
Out[101]: array([0, 1, 2, 3, 4])
In [102]: a += 10
In [103]: a
Out[103]: array([10, 11, 12, 13, 14])
In [104]: a += [1,10,100,1000,10000]
In [105]: a
Out[105]: array([   11,    21,   112,  1013, 10014])

您可以创建零数组,然后在其中插入数字,如下所示,或者在此问题中只写np.random.normal(1, 1, 100):

import numpy as np
a=np.zeros(100)
for i in range(10):
    n=np.random.normal(1, 1, 10)
    a[i*10:(i+1)*10] = n

最新更新