小编典典

numpy append:自动转换错误尺寸的数组

python

没有if子句,有没有一种方法可以执行以下操作?

我正在用pupynere读取一组netcdf文件,并想用numpy append创建一个数组。有时输入数据是多维的(请参见下面的变量“
a”),有时是一维的(“ b”),但第一维中的元素数始终相同(在下面的示例中为“ 9”)。

> import numpy as np
> a = np.arange(27).reshape(3,9)
> b = np.arange(9)
> a.shape
(3, 9)
> b.shape
(9,)

这按预期工作:

> np.append(a,a, axis=0)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8],
   [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
   [18, 19, 20, 21, 22, 23, 24, 25, 26],
   [ 0,  1,  2,  3,  4,  5,  6,  7,  8],
   [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
   [18, 19, 20, 21, 22, 23, 24, 25, 26]])

但是,添加b不能这么优雅地工作:

> np.append(a,b, axis=0)
ValueError: arrays must have same number of dimensions

追加的问题是(来自numpy手册)

“指定轴时,值必须具有正确的形状。”

为了获得正确的结果,我必须先进行投射。

> np.append(a,b.reshape(1,9), axis=0)
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8],
   [ 9, 10, 11, 12, 13, 14, 15, 16, 17],
   [18, 19, 20, 21, 22, 23, 24, 25, 26],
   [ 0,  1,  2,  3,  4,  5,  6,  7,  8]])

因此,在我的文件读取循环中,我当前正在使用一个if子句,如下所示:

for i in [a, b]:
    if np.size(i.shape) == 2:
        result = np.append(result, i, axis=0)
    else:
        result = np.append(result, i.reshape(1,9), axis=0)

有没有if语句来附加“ a”和“ b”的方法?

编辑:
虽然@Sven(使用np.atleast_2d())完美地回答了原始问题,但他(和其他人)指出代码效率低下。在下面的答案中,我结合了他们的建议,并替换了原始代码。现在它应该更加高效。谢谢。


阅读 126

收藏
2021-01-20

共1个答案

小编典典

您可以使用numpy.atleast_2d()

result = np.append(result, np.atleast_2d(i), axis=0)

就是说,请注意重复使用numpy.append()是构建NumPy数组的效率非常低的方法-
必须在每个步骤中重新分配它。如果有可能,请以所需的最终大小预分配数组,然后使用切片将其填充。

2021-01-20