2009-02-20 86 views
177

我不知道如何以我通常使用列表的方式使用数组或矩阵。我想创建一个空数组(或矩阵),然后一次添加一列(或行)。如何在NumPy中创建一个空数组/矩阵?

目前我能找到这样做的唯一方法是这样的:

mat = None 
for col in columns: 
    if mat is None: 
     mat = col 
    else: 
     mat = hstack((mat, col)) 

而如果它是一个名单,我会做这样的事情:

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

有为NumPy数组或矩阵使用这种符号的方法?

回答

261

你有错误的心理模型有效地使用NumPy。 NumPy数组存储在连续的内存块中。如果要将行或列添加到现有数组中,则需要将整个数组复制到新的内存块,从而为要存储的新元素创建间隙。如果反复执行以构建数组,则效率非常低。

在添加行的情况下,最好的办法是建立一个数组,它是一样大的数据集最终会,然后添加数据一行接一行:

>>> import numpy 
>>> a = numpy.zeros(shape=(5,2)) 
>>> a 
array([[ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.]]) 
>>> a[0] = [1,2] 
>>> a[1] = [2,3] 
>>> a 
array([[ 1., 2.], 
    [ 2., 3.], 
    [ 0., 0.], 
    [ 0., 0.], 
    [ 0., 0.]]) 
+75

还有numpy.empty()如果​​你不需要零数组。 – janneb 2009-04-19 21:19:34

+10

在零()上使用empty()有什么好处? – Zach 2012-09-01 16:11:34

+25

,如果您要立即用数据初始化它,则可以节省调零成本。 – marcorossi 2012-11-13 09:23:52

6

您可以使用附加功能。对于行:

>>> 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]]) 

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

62

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([]),但这是很少有用!

3

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

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
18

我看了很多,因为我需要在我的学校项目中使用numpy.array作为一个集合,我需要初始化为空...我没有在这里找到任何相关答案堆栈溢出,所以我开始涂鸦的东西。

# 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) 

我希望这有助于。

28

在NumPy中创建一个空的多维数组(例如用于存储矩阵的二维数组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.]] 
2

您可以将它应用于构建任何类型的阵列,如零:

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

De等待您使用的内容,您可能需要指定数据类型(请参阅'dtype')。在形状

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

对于RGB图像,包括颜色通道的数目:

例如,为了创建8位值的2D阵列(适合用作单色图像)shape=(H,W,3)

您可能还想考虑使用numpy.zeros进行零初始化,而不是使用numpy.empty。请参阅注释here