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

Ben*_*Ben 279 python arrays numpy

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

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

mat = None
for col in columns:
    if mat is None:
        mat = col
    else:
        mat = hstack((mat, col))
Run Code Online (Sandbox Code Playgroud)

如果它是一个列表,我会做这样的事情:

list = []
for item in data:
    list.append(item)
Run Code Online (Sandbox Code Playgroud)

有没有办法为NumPy数组或矩阵使用这种表示法?

Ste*_*ons 395

你有一个错误的心智模型来有效地使用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.]])
Run Code Online (Sandbox Code Playgroud)

  • 如果你不需要将数组归零,那么还有numpy.empty(). (112认同)
  • 如果您要立即使用您的数据对其进行初始化,则可以节省将其归零的成本. (42认同)
  • 在零()上使用empty()有什么好处? (21认同)
  • @maracorossi所以`.empty()`意味着可以在单元格中找到随机值,但是数组的创建速度比使用`.zeros()`更快? (14认同)
  • @ user3085931是的! (5认同)
  • 虽然提出了一个有价值的替代方案,但这并没有回答这个问题 (2认同)

Gre*_*all 87

NumPy数组是与列表非常不同的数据结构,旨在以不同的方式使用.您的使用hstack效率可能非常低......每次调用它时,现有数组中的所有数据都将复制到新数据中.(该append功能将有同样的问题.)如果你想在一个时间来建立你的矩阵一列,你可能是最好关闭,以保持它在一个列表中,直到它完成,然后才将其转换成一个数组.

例如


mylist = []
for item in data:
    mylist.append(item)
mat = numpy.array(mylist)
Run Code Online (Sandbox Code Playgroud)

item可以是列表,数组或任何可迭代的,只要每个item元素具有相同数量的元素即可.
在这种特殊情况下(data有一些可迭代的矩阵列)你可以简单地使用


mat = numpy.array(data)
Run Code Online (Sandbox Code Playgroud)

(另请注意,使用list作为变量名可能不是因为它掩盖好习惯内置这个名字,这可能会导致错误类型.)

编辑:

如果由于某种原因你确实想要创建一个空数组,你可以使用 numpy.array([]),但这很少有用!

  • 如果由于某种原因你需要定义一个空数组,但具有固定宽度(例如`np.concatenate()`),你可以使用:`np.empty((0, some_width))`。0,所以你的第一个数组不会是垃圾。 (3认同)

Fra*_*urt 45

要在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
Run Code Online (Sandbox Code Playgroud)

这会给你:

[[ 0.  0.]
 [ 0.  1.]
 [ 1.  0.]
 [ 1.  1.]
 [ 2.  0.]
 [ 2.  1.]
 [ 3.  0.]
 [ 3.  1.]
 [ 4.  0.]
 [ 4.  1.]]
Run Code Online (Sandbox Code Playgroud)

  • 但当然有很多例子,你不知道迭代范围,也不关心计算成本。在这种情况下很好的答案! (5认同)
  • 这应该是OP提出的问题的答案,对于您事先不知道#rows的用例,或者想要处理有0行的情况 (2认同)

小智 24

我调查了很多,因为我需要在我的一个学校项目中使用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)
Run Code Online (Sandbox Code Playgroud)

结果将是:

In [34]: x
Out[34]: array([], dtype=float64)
Run Code Online (Sandbox Code Playgroud)

因此,您可以直接初始化np数组,如下所示:

In [36]: x= np.array([], dtype=np.float64)
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • `a=np.array([])` 似乎默认为 `float64` (2认同)

Ped*_*ram 21

要创建空 NumPy 数组而不定义其形状,您可以执行以下操作:

arr = np.array([])
Run Code Online (Sandbox Code Playgroud)

第一个是首选,因为您知道您将使用它作为 NumPy 数组。np.ndarrayNumPy随后将其转换为类型,而不需要额外的[]“维度”。

为了向数组添加新元素,我们可以这样做:

arr = np.append(arr, 'new element')
Run Code Online (Sandbox Code Playgroud)

请注意,在 python 的背景中,不存在没有定义其形状的数组之类的东西。正如 @hpaulj 提到的,这也构成了一个一阶数组。


Il-*_*ima 6

您可以使用追加功能.对于行:

>>> from numpy import *
>>> a = array([10,20,30])
>>> append(a, [[1,2,3]], axis=0)
array([[10, 20, 30],      
       [1, 2, 3]])
Run Code Online (Sandbox Code Playgroud)

对于列:

>>> append(a, [[15],[15]], axis=1)
array([[10, 20, 30, 15],      
       [1, 2, 3, 15]])
Run Code Online (Sandbox Code Playgroud)

编辑
当然,正如其他答案中所提到的,除非你在矩阵/数组上做一些处理(例如反转),每当你向它添加一些东西时,我只会创建一个列表,追加到它然后将其转换为阵列.

  • 这如何回答这个问题?我没有看到有关空数组的部分 (3认同)

Dar*_*ius 5

这是使 numpys 看起来更像 Lists 的一些解决方法

np_arr = np.array([])
np_arr = np.append(np_arr , 2)
np_arr = np.append(np_arr , 24)
print(np_arr)
Run Code Online (Sandbox Code Playgroud)

输出:数组([ 2., 24.])