这是有效使用 NumPy 的错误思维模型。 NumPy 数组存储在连续的内存块中。要将行或列附加到现有数组,需要将整个数组复制到新的内存块,从而为要存储的新元素创建间隙。如果重复执行,这是非常低效的。
不要追加行,而是分配一个适当大小的数组,然后逐行分配给它:
>>> import numpy as np
>>> a = np.zeros(shape=(3, 2))
>>> a
array([[ 0., 0.],
[ 0., 0.],
[ 0., 0.]])
>>> a[0] = [1, 2]
>>> a[1] = [3, 4]
>>> a[2] = [5, 6]
>>> a
array([[ 1., 2.],
[ 3., 4.],
[ 5., 6.]])
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
来存储您的矩阵),以防您不知道 m
您将追加多少行并且不关心斯蒂芬西蒙斯提到的计算成本(即在每次追加时重新构建数组),您可以将要追加到的维度压缩到 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]])
编辑当然,正如其他答案中所提到的,除非您每次都在矩阵/数组上进行一些处理(例如反转),否则我只会创建一个列表,附加到它然后将其转换为大批。
要创建一个空的 NumPy 数组而不定义其形状,您可以执行以下操作:
arr = np.array([])
第一个是首选,因为您知道您将使用它作为 NumPy 数组。 NumPy 之后将其转换为 np.ndarray
类型,而无需额外的 []
'维度'。
为了向数组添加新元素,我们可以这样做:
arr = np.append(arr, 'new element')
请注意,在 python 的背景中,没有定义其形状的数组是不存在的。正如@hpaulj 提到的,这也构成了一个单秩数组。
np.array([])
创建一个形状为 (0,) 的数组,一个包含 0 个元素的一维数组。没有定义形状的数组是不存在的。并且 2) 与 1) 做同样的事情。
这是使 numpys 看起来更像列表的一些解决方法
np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)
输出:数组([2., 24.])
np.append
。尽管名称选择不当,但它不是列表追加克隆。
如果您绝对不知道数组的最终大小,可以像这样增加数组的大小:
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。
您可以应用它来构建任何类型的数组,例如零:
a = range(5)
a = [i*0 for i in a]
print a
[0, 0, 0, 0, 0]
a= [0] * 5
是简单的解决方案
另一种创建可以接受数组的空数组的简单方法是:
import numpy as np
np.empty((2,3), dtype=object)
我认为您想使用列表处理大部分工作,然后将结果用作矩阵。也许这是一种方式;
ur_list = []
for col in columns:
ur_list.append(list(col))
mat = np.matrix(ur_list)
我认为您可以创建空的 numpy 数组,例如:
>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)
当您想在循环中附加 numpy 数组时,此格式很有用。
也许您正在寻找的是这样的:
x=np.array(0)
通过这种方式,您可以创建一个没有任何元素的数组。它类似于:
x=[]
这样您就可以提前将新元素附加到您的数组中。
x
是一个具有形状 () 和一个元素的数组。它更像 0
而不是 []
。你可以称它为“标量数组”。
最简单的方法
输入:
import numpy as np
data = np.zeros((0, 0), dtype=float) # (rows,cols)
data.shape
输出:(0, 0)
输入:
for i in range(n_files):
data = np.append(data, new_data, axis = 0)
不定期副业成功案例分享
.empty()
意味着可以在单元格中找到随机值,但是创建数组的速度比使用.zeros()
快吗?