【问题标题】:NumPy append vs Python appendNumPy 追加与 Python 追加
【发布时间】:2015-04-25 03:56:53
【问题描述】:

在 Python 中,我可以附加到一个空数组,例如:

>>> a = []
>>> a.append([1,2,3])
>>> a.append([1,2,3])
>>> a
[[1, 2, 3], [1, 2, 3]]

如何在 NumPy 中做同样的事情?不幸的是,np.append 将数组展平(而且我需要在开头有一个空数组)。

【问题讨论】:

  • 我建议创建一个包含一个元素/行/列的零数组,然后使用np.append(),最后删除第一个元素/行/列。我建议是否可以预定义实际数组大小而不是每次都更改大小。
  • 创建您的列表,然后创建数组:np.array(a)。列表append 比数组append 快。

标签: python numpy


【解决方案1】:

OP 打算从空数组开始。所以,这是使用 NumPy 的一种方法

In [2]: a = np.empty((0,3), int)

In [3]: a
Out[3]: array([], shape=(0L, 3L), dtype=int32)

In [4]: a = np.append(a, [[1,2,3]], axis=0)

In [5]: a
Out[5]: array([[1, 2, 3]])

In [6]: a = np.append(a, [[1,2,3]], axis=0)

In [7]: a
Out[7]:
array([[1, 2, 3],
       [1, 2, 3]])

但是,如果您要附加大量循环。先追加列表再转成数组比追加 NumPy 数组要快。

In [8]: %%timeit
   ...: list_a = []
   ...: for _ in xrange(10000):
   ...:     list_a.append([1, 2, 3])
   ...: list_a = np.asarray(list_a)
   ...:
100 loops, best of 3: 5.95 ms per loop

In [9]: %%timeit
   ....: arr_a = np.empty((0, 3), int)
   ....: for _ in xrange(10000):
   ....:     arr_a = np.append(arr_a, np.array([[1,2,3]]), 0)
   ....:
10 loops, best of 3: 110 ms per loop

【讨论】:

  • NumPy 通常会自动转换列表,因此我删除了不需要的 array() 转换。
【解决方案2】:

我想你在找vstack

>>> import numpy as np
>>> a = [1, 2, 3]
>>> b = [1, 2, 3]
>>> np.vstack((a, b))
array([[1, 2, 3],
       [1, 2, 3]])

【讨论】:

  • NumPy 通常会自动转换列表,因此我删除了不需要的 array() 转换。
  • 这个答案比append() 更合适,因为vstack() 消除了对axis=0 的需要(以及复杂性)。
【解决方案3】:

使用np.append

让我们从一个空的二维数组开始:

In [8]: a = np.array([]); a = a.reshape((0, 3)); a
Out[8]: array([], shape=(0, 3), dtype=float64)

现在,让我们追加一些行:

In [19]: a = np.append(a, [[1, 2, 3]], axis=0 ); a
Out[19]: array([[ 1.,  2.,  3.]])

In [20]: a = np.append(a, [[1, 2, 3]], axis=0 ); a
Out[20]: 
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])

使用np.concatenate:

再次,让我们从一个空的二维数组开始:

In [28]: a = np.array([]); a = a.reshape((0, 3)); a
Out[28]: array([], shape=(0, 3), dtype=float64)

现在,让我们连接一些行:

In [29]: a = np.concatenate( (a, [[1, 2, 3]]), axis=0 ); a
Out[29]: array([[ 1.,  2.,  3.]])

In [30]: a = np.concatenate( (a, [[1, 2, 3]]), axis=0 ); a
Out[30]: 
array([[ 1.,  2.,  3.],
       [ 1.,  2.,  3.]])

【讨论】:

    猜你喜欢
    • 2019-05-03
    • 1970-01-01
    • 2013-04-26
    • 2018-01-14
    • 2015-02-21
    • 2018-09-28
    • 2011-12-08
    • 1970-01-01
    • 2018-06-02
    相关资源
    最近更新 更多