不成功附加到空的NumPy数组

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)

  • 谢谢你,你是第一个理解OP想要的东西的人(对我来说似乎很明显),你首先给了我们真正想要的东西.简而言之,_course_有一种方法可以连接到一个空数组!再次感谢. (6认同)
  • 哦,另一种声明"空"数组的方法是`a = np.zeros((0,3))` (3认同)

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) 的形状ab需要匹配.如果你附加一个(2,n)和(n,)你会得到一个(3,n)数组.您的代码正在尝试将(1,0)附加到(2,).那些形状不匹配,所以你得到一个错误.

  • @Naji Python不是无类型的; 它是动态输入的.许多(大多数?)动态语言都有一些不可变的数据结构,或者对你可以用它们做什么都有限制. (3认同)