Answers:
您对有效使用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.]])
.empty()
意味着人们可以在单元格中找到随机值,但是创建数组的速度比使用.zeros()
?更快。
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([])
,但这很少有用!
np.concatenate()
),则可以使用:np.empty((0, some_width))
。0,因此您的第一个数组不会成为垃圾。
要在NumPy中创建一个空的多维数组(例如,m*n
用于存储矩阵的2D数组),以防万一您不知道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.]]
我进行了很多研究,因为我需要在我的一个学校项目中使用numpy.array作为集合,并且需要将其初始化为空。在这里,我在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)
我希望这有帮助。
a=np.array([])
似乎默认为float64
您可以使用附加功能。对于行:
>>> 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]])
编辑
当然,正如其他答案中所述,除非每次对矩阵/数组进行一些处理(例如反转),否则每次将其添加到列表中时,我都会创建一个列表,将其添加到列表中,然后将其转换为数组。
您可以将其应用于构建任何类型的数组,例如零:
a = range(5)
a = [i*0 for i in a]
print a
[0, 0, 0, 0, 0]
a= [0] * 5
是一个简单的解决方案