我试图找出如何使用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