我无法弄清楚如何以通常使用列表的方式使用数组或矩阵。我想创建一个空数组(或矩阵),然后一次添加一列(或行)。
目前我能找到的唯一方法就是:
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数组或矩阵使用这种表示法?
答案 0 :(得分:358)
你有一个错误的心理模型来有效地使用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.]])
答案 1 :(得分:81)
NumPy数组是一种与列表完全不同的数据结构,旨在以不同的方式使用。使用hstack
可能效率很低......每次调用它时,现有数组中的所有数据都将复制到新数据中。 (append
函数会出现同样的问题。)如果你想一次一列地构建矩阵,你可能最好将它保存在列表中直到完成,然后才转换它成阵列。
e.g。
mylist = []
for item in data:
mylist.append(item)
mat = numpy.array(mylist)
item
可以是列表,数组或任何可迭代的
因为每个item
具有相同数量的元素
在这种特殊情况下(data
是一个可迭代的矩阵列),你可以简单地使用
mat = numpy.array(data)
(另请注意,使用list
作为变量名称可能不是很好的做法,因为它会用该名称掩盖内置类型,这可能会导致错误。)
编辑:
如果由于某种原因你真的想创建一个空数组,你可以使用 numpy.array([])
,但这很少有用!
答案 2 :(得分:38)
在NumPy中创建一个空的多维数组(例如,一个2D数组m*n
来存储矩阵),以防您不知道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.]]
答案 3 :(得分:22)
我对此进行了很多研究,因为我需要在我的一个学校项目中使用numpy.array作为一个集合,我需要初始化为空...我在堆栈上没有找到任何相关的答案溢出,所以我开始乱涂乱画。
# 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)
我希望这会有所帮助。
答案 4 :(得分:6)
您可以使用追加功能。对于行:
>>> 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]])
修改强>
当然,正如其他答案中所提到的,除非你在矩阵/数组上进行一些处理(例如反转),每当你向它添加一些东西时,我只会创建一个列表,追加它然后将它转换为数组
答案 5 :(得分:5)
有一些解决方法可以使numpys看起来更像列表
np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)
输出:array([2.,24。])
答案 6 :(得分:3)
如果您完全不知道数组的最终大小,可以像这样增加数组的大小:
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
。答案 7 :(得分:3)
您可以应用它来构建任何类型的数组,如零:
a = range(5)
a = [i*0 for i in a]
print a
[0, 0, 0, 0, 0]
答案 8 :(得分:2)
另一种创建可以接受数组的空数组的简单方法是:
import numpy as np
np.empty((2,3), dtype=object)
答案 9 :(得分:1)
根据您使用此功能,您可能需要指定数据类型(请参阅'dtype')。
例如,创建一个8位值的二维数组(适合用作单色图像):
myarray = numpy.empty(shape=(H,W),dtype='u1')
对于RGB图像,请在形状中包含颜色通道的数量:shape=(H,W,3)
您可能还想考虑使用numpy.zeros
进行零初始化,而不是使用numpy.empty
。请参阅注释here。
答案 10 :(得分:1)
我认为您可以创建一个空的numpy数组,例如:
>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)
当您要在循环中附加numpy数组时,此格式很有用。
答案 11 :(得分:1)
要创建一个空的NumPy数组而不定义其形状,必须采取以下方法:
1。
def check_condition
if true
redirect_to posts_path && return
else
redirect_to new_post_path && return
end
end
首选。因为您知道您将使用它作为numpy。
2。
arr = np.array([])
NumPy之后将其转换为np.ndarray类型,而无需额外的arr = []
# and use it as numpy. append to it or etc..
[]
。
答案 12 :(得分:0)
我认为您想处理列表的大部分工作,然后将结果用作矩阵。也许这是一种方式;
ur_list = []
for col in columns:
ur_list.append(list(col))
mat = np.matrix(ur_list)
答案 13 :(得分:0)
也许您正在寻找的东西是这样的:
x=np.array(0)
这样,您可以创建一个没有任何元素的数组。类似于:
x=[]
这样,您将可以预先向数组添加新元素。
答案 14 :(得分: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)