如何在NumPy中创建一个空数组/矩阵?

时间:2009-02-20 09:58:12

标签: python arrays numpy

我无法弄清楚如何以通常使用列表的方式使用数组或矩阵。我想创建一个空数组(或矩阵),然后一次添加一列(或行)。

目前我能找到的唯一方法就是:

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数组或矩阵使用这种表示法?

15 个答案:

答案 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)