【发布时间】: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.append和np.vstack,您会发现它们在调用np.concatenate之前有if-else 语句。reshape之后有什么问题?与重复concatenate所需的复制相比,if和reshape都便宜。
标签: python numpy append numpy-ndarray