【问题标题】:Numpy append 2D array in for loop over rowsNumpy在for循环中追加二维数组
【发布时间】:2021-08-10 10:35:03
【问题描述】:

我想在 for 循环中垂直添加一个二维数组。
我尝试了 append 方法,但这不会垂直堆叠(我不想避免稍后重塑结果),我尝试了 vstack() 函数,但这不适用于空数组。 有谁知道如何解决这个问题?

import numpy as np
mat = np.array([])
for i in np.arange(3):
    val = np.random.rand(2, 2)
    mat = np.append(mat,val)

我可以想到以下解决方案:

for i in np.arange(3):
    val = np.random.rand(2, 2)
    if i==0:
        mat = val
    else:
        mat = np.vstack((mat,val))

有没有一种解决方案,我只附加值“val”而不指定额外的 if-else 语句?

【问题讨论】:

  • 您是想附加 2D 数组来制作 3D 数组,还是只向下扩展 2D 数组?阵列的预期形状是什么?你提前知道阵列的形状吗?使用 np.append 很慢,因为每次调用它都会创建一个新数组。如果您可以用零初始化一个数组,那么添加会更好的数据。或者,您可以创建一个列表列表,然后转换为 numpy 数组。
  • 在循环内使用vals.append(np.random.rand(2, 2)),然后在循环后使用mat = np.vstack(vals)?在您的示例中,即使使用列表理解,您也可以这样做。
  • 我想要二维数组并追加到行上。预期具有像第二个解决方案一样的形状 (6,2)。我想在代码中避免这个 if-else 语句。有办法吗?
  • np.append 将垂直堆叠 - 但您首先必须花时间阅读它的文档! np.append 只是对np.concatenate 的粗略编写的前端,让你觉得你在做类似列表追加方法的事情。
  • 为什么要避免 vstack 示例中的 if-else?如果您查看[source]np.appendnp.vstack,您会发现它们在调用np.concatenate 之前有if-else 语句。 reshape 之后有什么问题?与重复 concatenate 所需的复制相比,ifreshape 都便宜。

标签: python numpy append numpy-ndarray


【解决方案1】:

使用 np.empty 初始化一个空数组并定义要附加的轴:

import numpy as np
mat = np.empty((0,2))
for i in np.arange(3):
    val = np.random.rand(2, 2)
    mat = np.append(mat,val, axis=0)
print(mat)

输出:

[[0.08527627 0.40567273]
 [0.39701354 0.72642426]
 [0.17540761 0.02579183]
 [0.76271521 0.83032347]
 [0.08105248 0.67986726]
 [0.48079453 0.37454798]]

但是,如我的评论中所述,如果您需要多次附加,则应考虑初始化正确大小的数组,然后使用 np.append() 分配值或改为附加到列表(如果您不知道数组的大小)然后在之后创建一个numpy数组

【讨论】:

  • 不确定这里发生了什么:AA = array([[0.8336, 0.7219, 0.4219, 0.5242, 0.2185, 0.5263, 0.9378], [1.5199, 1.3509, 0.8133, 1.0232, 0.438.5, 773] 728,1. , [2.1065, 2.185, 1.352, 1.5063, 0.7637, 1.4393, 2.7533], [2.9781, 2.749, 2.1404, 2.426, 1.1021, 2.5482, 3.6495]((4,7))(np.empt) ,axis=0) 变成形状 (8,7)?
  • 用 np.append(np.empty((0,7)) 替换 np.append(np.empty((4,7))。Empty 使用“随机”数据,因此包含值(在我的情况是之前的值,因此与“AA”的值相同。如果你不想要这个,你也可以使用 np.zeros((0,7)) (但是当数组的高度无关紧要是 0)
猜你喜欢
  • 2022-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-03
  • 2014-11-03
  • 2020-10-12
  • 2016-06-28
相关资源
最近更新 更多