【问题标题】:How to iterate over the n-th dimenstion of a numpy array? [duplicate]如何迭代numpy数组的第n维? [复制]
【发布时间】:2019-06-05 12:17:31
【问题描述】:

我使用连接任意形状的 numpy 数组以使我的代码更清晰,但是,我似乎很难以 python 式的方式对其进行迭代。

让我们考虑一个 4 维数组 x(因此是 len(x.shape) = 4),并且我想要迭代的索引是 2,我通常使用的天真的解决方案类似于

y = np.array([my_operation(x[:, :, i, :])
              for i in range(x.shape[2])])

我正在寻找更具可读性的东西,因为有这么多“:”很烦人,而且 x 的尺寸发生任何变化都需要重写我的部分代码。像魔法一样的东西

y = np.array([my_operation(z) for z in magic_function(x, 2)])

是否有一个 numpy 方法可以让我遍历数组的任意维度?

【问题讨论】:

  • 任何轴上的迭代都是次优的。快速编译的ufuncs 提供axisaxes 参数,因此您不必显式迭代。有一些“应用...”功能,但它们是便利工具,而不是性能增强器。为了获得更多的通用性,Python 代码往往会很长。因此,您自己的“magic_function”,调整到您自己的可能迭代子集是最佳选择。

标签: python numpy


【解决方案1】:

一种可能的解决方案是使用 dict()。

你可以做的是:

x = dict()
x['param1'] = [1, 1, 1, 1]
x['param2'] = [2, 2, 2, 2]

print(x['param1']) 
# > [1, 1, 1, 1]

【讨论】:

    【解决方案2】:

    我不知道有什么标准方法可以做到这一点。不管怎样,你的把戏很好。我们可以稍微详细说明一下,我们会得到您正在寻找的“魔术函数”的实现:

    def magic_function(x, n):
        slices = [slice(w) for w in x.shape]
        for i in range(x.shape[n]):
            slices[n] = i
            z = x[tuple(slices)]
            yield z
    

    【讨论】:

      【解决方案3】:

      您可以暂时将所需的轴移到前面,然后遍历数组。然后将轴向后移动:

      x = np.moveaxis(x, 2, 0)
      x = np.array([my_operation(sub_x) for sub_x in x])
      x = np.moveaxis(x, 0, 2)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-04-03
        • 2022-11-15
        • 2016-01-28
        • 1970-01-01
        • 1970-01-01
        • 2018-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多