我如何创建一个空数组,然后附加到它在NumPy?

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

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

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

1351354 次浏览

可以使用append函数。行:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],
[1, 2, 3]])

列:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],
[1, 2, 3, 15]])

< p > 编辑 < br > 当然,正如在其他答案中提到的,除非你在矩阵/数组上做一些处理(例如反转),每次你添加一些东西到它,我只会创建一个列表,添加到它,然后将其转换为数组

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

如。


mylist = []
for item in data:
mylist.append(item)
mat = numpy.array(mylist)
item可以是一个列表、数组或任何可迭代对象,只要长 因为每个item具有相同数量的元素 在这种特殊情况下(data是一个包含矩阵列的可迭代对象),你可以简单地使用


mat = numpy.array(data)

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

编辑:

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

如果你完全不知道数组的最终大小,你可以像这样增加数组的大小:

my_arr = numpy.zeros((0,5))
for i in range(3):
my_arr=numpy.concatenate( ( my_arr, numpy.ones((1,5)) ) )
print(my_arr)


[[ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]  [ 1.  1.  1.  1.  1.]]
  • 注意第一行中的0
  • numpy.append是另一个选项。它调用numpy.concatenate

我研究了很多,因为我需要使用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中创建一个空的多维数组(例如,一个2D数组m*n来存储矩阵),如果你不知道m你将追加多少行,并且不关心Stephen Simmons提到的计算成本(即在每次追加时重新构建数组),你可以将你想追加的维度压缩为0:X = np.empty(shape=[0, n])

这样你可以使用例如(这里的m = 5,我们假设我们在创建空矩阵时不知道,还有n = 2):

import numpy as np


n = 2
X = np.empty(shape=[0, n])


for i in range(5):
for j  in range(2):
X = np.append(X, [[i, j]], axis=0)


print X

这将给你:

[[ 0.  0.]
[ 0.  1.]
[ 1.  0.]
[ 1.  1.]
[ 2.  0.]
[ 2.  1.]
[ 3.  0.]
[ 3.  1.]
[ 4.  0.]
[ 4.  1.]]

你可以应用它来构建任何类型的数组,比如0:

a = range(5)
a = [i*0 for i in a]
print a
[0, 0, 0, 0, 0]

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

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

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

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

你也可以考虑使用numpy.zeros而不是使用numpy.empty进行零初始化。参见注释在这里

我认为你想用列表处理大部分工作,然后将结果作为矩阵使用。也许这是一种方法;

ur_list = []
for col in columns:
ur_list.append(list(col))


mat = np.matrix(ur_list)

我认为你可以像这样创建空numpy数组:

>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)

当您想在循环中追加numpy数组时,这种格式非常有用。

下面是一些使numpys看起来更像list的方法

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)

输出:array([2.], 24。)

为了创建一个空的NumPy数组而不定义它的形状,你可以做以下事情:

arr = np.array([])

首选第一个,因为您知道将使用它作为NumPy数组。NumPy随后将其转换为np.ndarray类型,不需要额外的[]“维度”。

要向数组中添加新元素,我们可以这样做:

arr = np.append(arr, 'new element')
注意,在python的后台中,没有数组这样的东西 定义它的形状。正如@hpaulj提到的那样,这也会产生一个单秩 数组。< / p >

也许你正在寻找的是这样的东西:

x=np.array(0)

通过这种方式,您可以创建一个没有任何元素的数组。它类似于:

x=[]

通过这种方式,您可以提前向数组中添加新元素。

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

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

最简单的方法

输入:

import numpy as np
data = np.zeros((0, 0), dtype=float)   # (rows,cols)
data.shape

输出:
(0,0) < / p >

输入:

for i in range(n_files):
data = np.append(data, new_data, axis = 0)