如何在NumPy中创build一个空的数组/matrix?

我不知道如何以我通常使用列表的方式使用数组或matrix。 我想创build一个空的数组(或matrix),然后添加一列(或行)到它一次。

目前唯一能find的方法就是:

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数组或matrix的那种符号?

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

在添加行的情况下,最好的办法是创build一个与您的数据集最终一样大的数组,然后逐行添加数据:

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

NumPy数组是一个与列表非常不同的数据结构,它被devise为以不同的方式使用。 您使用hstack效率可能非常低下…每当您调用它时,现有数组中的所有数据都将被复制到一个新的数据中。 ( append函数将会有同样的问题。)如果你想一次构build一个列,你可能最好把它保存在一个列表中,直到完成,然后把它转换成一个数组。

例如

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

item可以是一个列表,一个数组或任何迭代,只要每个item具有相同数量的元素。
在这个特定的情况下( data是一些持有matrix列的迭代),你可以简单地使用

 mat = numpy.array(data) 

(还要注意,使用list作为variables名可能不是好的做法,因为它掩盖了内置types的名称,这可能会导致错误。)

编辑:

如果由于某种原因,你真的想创build一个空数组,你可以使用numpy.array([]) ,但这是很less有用的!

要在NumPy中创build一个空的multidimensional array(例如一个二维数组m*n来存储matrix),以防万一您不知道您将追加多less行,并且不关心计算成本Stephen Simmons提到在每个追加处重新构build数组),可以将要追加的维数挤压为0: X = np.empty(shape=[0, n])

这样你可以使用例如(这里m = 5 ,我们假设我们不知道什么时候创build空matrix, 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.]] 

我研究了很多,因为我需要在我的一个学校项目中使用numpy.array作为一个集合,我需要初始化为空…我没有在Stack Overflowfind任何相关的答案,所以我开始涂鸦的东西。

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

我希望这有帮助。

您可以使用追加function。 对于行:

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

编辑
当然,正如其他答案中所提到的,除非在matrix/数组上进行一些处理(例如反转),否则每次附加一些东西时,我只需创build一个列表,然后将其附加到列表中,然后将其转换为数组。

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

 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是另一种select。 它调用numpy.concatenate

您可以将其应用于构build任何types的数组,如零:

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

根据你使用的是什么,你可能需要指定数据types(参见'dtype' )。

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

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

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

你也可以考虑使用numpy.zeros来初始化,而不是使用numpy.empty 。 看到这里的说明。