如何在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
。 看到这里的说明。