【问题标题】:Python apply_along_axis of multiple arraysPython apply_along_axis 的多个数组
【发布时间】:2015-05-08 01:29:44
【问题描述】:

如果我有一个函数 f(x),它将单个一维数组作为参数并生成一维数组作为输出,我可以使用 numpy.apply_along_axis 将该函数应用于二维数组的每一行X 的行是 f 的有效参数。

现在我想用一个带有两个参数的函数来做类似的事情。 例如。我有一个函数 f(x, y) ,它以两个 1d 数组作为参数,我还有两个 2d 数组 X,Y 都有 n 行。我想将 f 应用于每对行,生成一个再次包含 n 行的数组。

如何以有效的方式完成此任务?

我也对变体感兴趣,其中 f 需要更多参数或涉及更高维数组:

例如 f 可以采用形状为 (2,2) 的 3 个数组 x、y、z; (3,); (5,) 并产生形状 (4,4) 的结果。

我有 X、Y、Z 形状(50、100、2、2); (50, 100, 3); (50, 100, 5) 并想要形状 (50, 100, 4, 4) 的结果

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    查看numpy.apply_along_axis 的代码,我发现它只是迭代其他维度,将您的函数应用于每个“行”。有额外的代码允许尺寸约为 2。但对于 2d X 它归结为:

    result = np.empty_like(X)
    for i, x in enumerate(X):
        result[i] = func1d(x)
    

    还有代码可以推断result 应该具有什么形状。例如,如果 func1dnp.sum,那么 result 将是 1d,而不是像输入那样的 2d。

    所以这个函数没有特别的“效率”。多个输入的扩展可以是普通的 Python zip:

     result = np.empty_like(X)
     for i,(x,y) in enumerate(zip(X,Y)):
         result[i] = func1d(x,y)
    

    np.ndindex 是生成索引的便捷工具。它的代码值得一看。它使用通用的 numpy 迭代器,np.nditer,参见:http://docs.scipy.org/doc/numpy/reference/arrays.nditer.html

    例如 f 可以采用形状为 (2,2) 的 3 个数组 x、y、z; (3,); (5,) 并产生形状 (4,4) 的结果。

    我有 X、Y、Z 形状(50、100、2、2); (50, 100, 3); (50, 100, 5) 并想要形状 (50, 100, 4, 4) 的结果

    for i,j in np.ndindex(50,100):
        result[i,j,:,:] = f(X[i,j,:,:], Y[i,j,:,:], Z[i,j,:,:])
    

    ':' 不是必需的,但请明确说明我们正在对其中的 2 个维度进行索引,并对其余维度进行切片。如果您想在第 1 维和第 3 维上进行迭代,并对第 2 维进行切片,则需要它们。

    【讨论】:

    • 哇,谢谢!我一直认为 apply_along_axis 会比 for 循环更有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 2016-02-13
    • 2018-09-10
    • 1970-01-01
    • 2016-02-17
    • 2023-01-26
    • 2020-02-14
    相关资源
    最近更新 更多