我不知道如何像通常使用列表那样使用数组或矩阵。我想创建一个空数组(或矩阵),然后一次向其中添加一列(或一行)。
目前,我能找到的唯一方法是:
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数组或矩阵?
发布于 2009-02-20 10:36:46
你有一个错误的心理模型来有效地使用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.]])
发布于 2009-02-20 10:44:20
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([])
,但这很少有用!
发布于 2014-04-10 12:34:59
为了在NumPy中创建一个空的多维数组(例如,一个2D数组m*n
来存储您的矩阵),如果你不知道你将追加多少行,也不关心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.]]
https://stackoverflow.com/questions/568962
复制相似问题