目前,我能找到的唯一方法是:
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数组或矩阵使用这种表示法的方法?
#1 楼
您对有效使用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.]])
#2 楼
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([])
,但这很少有用!评论
numpy数组/矩阵与Matlab数组/矩阵有根本区别吗?
–levesque
2010年11月11日,3:20
如果由于某种原因需要定义一个空数组但宽度固定(例如np.concatenate()),则可以使用:np.empty((0,some_width))。 0,因此您的第一个数组不会成为垃圾。
– NumesSanguis
17年9月1日下午5:56
#3 楼
要在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.]]
评论
对于您事先不知道#rows或想处理0行的情况,这应该是OP所问问题的答案
– Spcogg第二
19年8月15日在4:52
#4 楼
我进行了很多研究,因为我需要在我的一个学校项目中使用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)
我希望这会有所帮助。
评论
如问题所示,这不适用于数组,但对向量很有用。
– Divenex
17年12月22日在16:31
a = np.array([])似乎默认为float64
– P i
19年9月7日在9:58
#5 楼
您可以使用附加功能。对于行:>>> 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]])
编辑
当然,如其他答案中所述,除非每次对矩阵/数组进行一些处理(例如反转),否则只要创建一个列表,将其追加到列表中,然后将其转换为数组即可。
#6 楼
这是一些使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.])
#7 楼
如果您完全不知道数组的最终大小,则可以像这样增加数组的大小: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
。#8 楼
您可以将其应用于构建任何类型的数组,例如零:a = range(5)
a = [i*0 for i in a]
print a
[0, 0, 0, 0, 0]
评论
如果要在纯python中执行此操作,则a = [0] * 5是简单的解决方案
–Makers_F
15年12月22日在3:46
#9 楼
根据使用的目的,您可能需要指定数据类型(请参见“ dtype”)。例如,创建一个8位值的2D数组(适合用作单色图像):
myarray = numpy.empty(shape=(H,W),dtype='u1')
对于RGB图像,请包括形状中的颜色通道数:
shape=(H,W,3)
您可能还需要考虑使用
numpy.zeros
而不是numpy.empty
进行零初始化。请参阅此处的注释。#10 楼
我认为您想处理列表的大部分工作,然后将结果用作矩阵。也许这是一种方式;ur_list = []
for col in columns:
ur_list.append(list(col))
mat = np.matrix(ur_list)
#11 楼
我认为您可以创建空的numpy数组,例如:>>> import numpy as np
>>> empty_array= np.zeros(0)
>>> empty_array
array([], dtype=float64)
>>> empty_array.shape
(0,)
要在循环中添加numpy数组时,此格式很有用。
#12 楼
要在不定义形状的情况下创建空的NumPy数组,请执行以下操作:arr = np.array([])
(这是首选方法,因为您知道将其用作NumPy数组)
arr = [] # and use it as NumPy array later by converting it
arr = np.asarray(arr)
NumPy之后将其转换为np.ndarray类型,无需额外操作
[]
'尺寸'。#13 楼
也许您正在寻找的是这样的东西:x=np.array(0)
这样,您可以创建一个没有任何元素的数组。它类似于:
x=[]
这样,您将可以预先向数组添加新元素。
评论
如果不需要将数组归零,则还有numpy.empty()。
– janneb
09年4月19日在21:19
使用empty()而不是zeros()有什么好处?
–扎克
2012年9月1日16:11
如果您要立即使用数据进行初始化,则可以节省将数据清零的费用。
– marcorossi
2012年11月13日在9:23
@maracorossi,所以.empty()意味着可以在单元格中找到随机值,但是创建数组的速度比例如用.zeros()?
–user3085931
16年7月13日在17:38
@ user3085931是的!
–内森(Nathan)
16-09-30在15:33