我想创建一个空数组,并将项附加到它,一次一个。

xs = []
for item in data:
    xs.append(item)

我可以用NumPy数组使用这种列表风格的符号吗?


当前回答

这是有效使用NumPy的错误思维模式。NumPy数组存储在连续的内存块中。要向现有数组追加行或列,需要将整个数组复制到一个新的内存块,为存储的新元素创建间隙。如果重复这样做,效率是非常低的。

与其追加行,不如分配一个适当大小的数组,然后逐行赋值:

>>> import numpy as np

>>> a = np.zeros(shape=(3, 2))
>>> a
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

>>> a[0] = [1, 2]
>>> a[1] = [3, 4]
>>> a[2] = [5, 6]

>>> a
array([[ 1.,  2.],
       [ 3.,  4.],
       [ 5.,  6.]])

其他回答

我研究了很多,因为我需要使用numpy。在我的一个学校项目中,我需要将数组初始化为空…我在Stack Overflow上没有找到任何相关的答案,所以我开始涂鸦。

# Initialize your variable as an empty list first
In [32]: x=[]
# and now cast it as a numpy ndarray
In [33]: x=np.array(x)

结果将是:

In [34]: x
Out[34]: array([], dtype=float64)

因此,可以直接初始化np数组,如下所示:

In [36]: x= np.array([], dtype=np.float64)

我希望这能有所帮助。

NumPy数组是一种与列表非常不同的数据结构,被设计成以不同的方式使用。你对hstack的使用可能非常低效…每次调用它时,现有数组中的所有数据都会复制到一个新数组中。(附加函数也会有同样的问题。)如果你想一次一列地构建你的矩阵,你最好将它保存在一个列表中,直到它完成,然后才将它转换成一个数组。

e.g.


mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)

Item可以是列表、数组或任何可迭代对象 因为每一项都有相同数量的元素。 在这种特殊情况下(data是一个包含矩阵列的可迭代对象),您可以简单地使用


mat = numpy.array(data)

(还要注意,使用list作为变量名可能不是一个好的实践,因为它用该名称掩盖了内置类型,这可能会导致错误。)

编辑:

如果出于某种原因,您确实想要创建一个空数组,您可以使用numpy.array([]),但这很少有用!

根据你使用它的目的,你可能需要指定数据类型(参见'dtype')。

例如,要创建一个8位值的2D数组(适合用作单色图像):

myarray = numpy.empty(shape=(H,W),dtype='u1')

对于RGB图像,包括形状中的颜色通道数:shape=(H,W,3)

您还可以考虑使用numpy进行零初始化。0代替numpy.empty。请看这里的说明。

另一个创建空数组的简单方法是:

import numpy as np
np.empty((2,3), dtype=object)

这是有效使用NumPy的错误思维模式。NumPy数组存储在连续的内存块中。要向现有数组追加行或列,需要将整个数组复制到一个新的内存块,为存储的新元素创建间隙。如果重复这样做,效率是非常低的。

与其追加行,不如分配一个适当大小的数组,然后逐行赋值:

>>> import numpy as np

>>> a = np.zeros(shape=(3, 2))
>>> a
array([[ 0.,  0.],
       [ 0.,  0.],
       [ 0.,  0.]])

>>> a[0] = [1, 2]
>>> a[1] = [3, 4]
>>> a[2] = [5, 6]

>>> a
array([[ 1.,  2.],
       [ 3.,  4.],
       [ 5.,  6.]])