【问题标题】:Append a numpy.array to a certain numpy.array stored in a list将 numpy.array 附加到存储在列表中的某个 numpy.array
【发布时间】:2023-03-21 23:22:01
【问题描述】:

我一直在努力理解为什么我无法做到这一点:

>>> import numpy as np
>>> a = [np.empty((0,78,3)) for i in range(2)]
>>> b = np.random.randint(10,size=(1,78,3))
>>> a[0] = np.append(a[0],[b],axis=0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib/python2.7/site-packages/numpy/lib/function_base.py", line 5003, in append
    return concatenate((arr, values), axis=axis)
ValueError: all the input arrays must have same number of dimensions
>>> 

a 是一个列表,其中包含 s 个形状为 (0,78,3) 的空 numpy 数组

b 是一个形状为 (1,78,3) 的随机 numpy.array

然后我尝试将b 附加到a[0]... 但这似乎不可能,因为没有相同的尺寸?...我不确定这里有什么问题.. 如果我删除了列表部分它会起作用,那么为什么不使用列表呢?..

【问题讨论】:

  • 添加时只需从 b 中删除 []。 a[0] = np.append(a[0],b,axis=0)

标签: python arrays list numpy


【解决方案1】:

远离np.append。学习正确使用np.concatenate。这个附加只会造成混乱。

根据您的定义,这是可行的:

In [20]: a1 = [np.concatenate((i,b),axis=0) for i in a]
In [21]: [i.shape for i in a1]
Out[21]: [(1, 78, 3), (1, 78, 3)]
In [22]: a
Out[22]: 
[array([], shape=(0, 78, 3), dtype=float64),
 array([], shape=(0, 78, 3), dtype=float64)]
In [23]: b.shape
Out[23]: (1, 78, 3)
In [24]: a1 = [np.concatenate((i,b),axis=0) for i in a]
In [25]: [i.shape for i in a1]
Out[25]: [(1, 78, 3), (1, 78, 3)]

一个 (0,78,3) 可以在轴 0 上与一个 (1,78,3) 数组连接,产生另一个 (1,78,3) 数组。

但是为什么要这样做呢?它只是列出了一个包含 2 个 b 副本的列表。

c = [b,b]

这样做也一样,而且更简单。

如果您必须收集许多形状 (78,3) 的数组,请这样做

alist = []
for _ in range(n):
   alist.append(np.ones((78,3)))

n个数组的结果列表可以变成一个数组

np.array(alist)   # (n, 78, 3) array

或者,如果您收集 (1,78,3) 数组的列表,np.concatenate(alist, axis=0) 会将它们加入 (n,78,3) 数组。

【讨论】:

    【解决方案2】:

    您没有附加b,而是[b]。那是行不通的。

    所以为了附加b,使用

    a[0] = np.append(a[0],b,axis=0)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-08-24
      • 1970-01-01
      • 2019-07-30
      • 1970-01-01
      • 2019-03-29
      相关资源
      最近更新 更多