Cup*_*tor 32 python arrays numpy append
我试图使用append填充一个空(不是np.empty!)数组的值,但我得到错误:
我的代码如下:
import numpy as np
result=np.asarray([np.asarray([]),np.asarray([])])
result[0]=np.append([result[0]],[1,2])
Run Code Online (Sandbox Code Playgroud)
我得到了:
ValueError: could not broadcast input array from shape (2) into shape (0)
Run Code Online (Sandbox Code Playgroud)
Sim*_*her 68
我可能会错误地理解这个问题,但是如果你想声明某个形状的数组但内部没有任何内容,则以下内容可能会有所帮助:
初始化空数组:
>>> a = np.zeros((0,3)) #or np.empty((0,3)) or np.array([]).reshape(0,3)
>>> a
array([], shape=(0, 3), dtype=float64)
Run Code Online (Sandbox Code Playgroud)
现在,您可以使用此数组向其追加相似形状的行.请记住,numpy数组是不可变的,因此为每次迭代创建一个新数组:
>>> for i in range(3):
... a = np.vstack([a, [i,i,i]])
...
>>> a
array([[ 0., 0., 0.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Run Code Online (Sandbox Code Playgroud)
np.vstack和np.hstack是组合numpy数组的最常用方法,但是来自Matlab我更喜欢np.r_和np.c_:
连接1d:
>>> a = np.zeros(0)
>>> for i in range(3):
... a = np.r_[a, [i, i, i]]
...
>>> a
array([ 0., 0., 0., 1., 1., 1., 2., 2., 2.])
Run Code Online (Sandbox Code Playgroud)
连接行:
>>> a = np.zeros((0,3))
>>> for i in range(3):
... a = np.r_[a, [[i,i,i]]]
...
>>> a
array([[ 0., 0., 0.],
[ 1., 1., 1.],
[ 2., 2., 2.]])
Run Code Online (Sandbox Code Playgroud)
连接列:
>>> a = np.zeros((3,0))
>>> for i in range(3):
... a = np.c_[a, [[i],[i],[i]]]
...
>>> a
array([[ 0., 1., 2.],
[ 0., 1., 2.],
[ 0., 1., 2.]])
Run Code Online (Sandbox Code Playgroud)
Bi *_*ico 36
numpy.append与python中的list.append非常不同.我知道那些新的numpy程序员已经抛弃了.numpy.append更像是连接,它创建一个新数组,并用旧数组中的值和要追加的新值填充它.例如:
import numpy
old = numpy.array([1, 2, 3, 4])
new = numpy.append(old, 5)
print old
# [1, 2, 3, 4]
print new
# [1, 2, 3, 4, 5]
new = numpy.append(new, [6, 7])
print new
# [1, 2, 3, 4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
我认为您可以通过以下方式实现目标:
result = numpy.zeros((10,))
result[0:2] = [1, 2]
# Or
result = numpy.zeros((10, 2))
result[0, :] = [1, 2]
Run Code Online (Sandbox Code Playgroud)
更新:
如果你需要使用循环创建一个numpy数组,并且你事先不知道数组的最终大小是什么,你可以做类似的事情:
import numpy as np
a = np.array([0., 1.])
b = np.array([2., 3.])
temp = []
while True:
rnd = random.randint(0, 100)
if rnd > 50:
temp.append(a)
else:
temp.append(b)
if rnd == 0:
break
result = np.array(temp)
Run Code Online (Sandbox Code Playgroud)
在我的示例中,结果将是一个(N,2)数组,其中N是循环运行的次数,但显然您可以根据需要进行调整.
新的更新
您看到的错误与类型无关,它与您尝试连接的numpy数组的形状有关.如果你做np.append(a, b) 的形状a和b需要匹配.如果你附加一个(2,n)和(n,)你会得到一个(3,n)数组.您的代码正在尝试将(1,0)附加到(2,).那些形状不匹配,所以你得到一个错误.