【问题标题】:Apply a function across multiple axes of a 3D numpy array跨 3D numpy 数组的多个轴应用函数
【发布时间】:2021-09-12 02:20:18
【问题描述】:

我有形状为(2, n, m) 的 3-D numpy 数组,n,m 是任意的,我们称之为X。我有两个函数F = F(x: np.ndarray, y: np.ndarray)G = G(x: np.ndarray, y: np.ndarray),其中xy 是长度为m 的一维数组,这些函数也返回形状为m 的一维数组。我想对X 应用转换,在第二个轴上操作,使用FG

for idx in range(n):
    X[0][idx], X[1][idx] = F(X[0][idx], X[1][idx]), G(X[0][idx], X[1][idx])

示例

假设m = n = 2,然后让

import numpy as np

X = np.arange(8).reshape(2,2,2)


In [18]: X
Out[18]: 
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])

假设 FG 由(虚拟函数这些不是真实的)定义

def F(x: np.ndarray, y: np.ndarray) -> np.ndarray:
    return x - y

def G(x: np.ndarray, y: np.ndarray) -> np.ndarray:
    return y - x

然后将转换应用于 X

for idx in range(2):
    X[0][idx], X[1][idx] = F(X[0][idx], X[1][idx]), G(X[0][idx], X[1][idx])

我明白了

In [23]: X
Out[23]: 
array([[[-4, -4], 
        [-4, -4]],

       [[ 4,  4],
        [ 4,  4]]])

示例 2

考虑F = np.crossG = -FX =np.arange(12).reshape(2,2,3)

for idx in range(2):
    X[0][idx], X[1][idx] = np.cross(X[0][idx], X[1][idx]), - np.cross(X[0[idx], X[1][idx])

那么,

In [49]: X
Out[49]: 
array([[[ -6,  12,  -6],
        [ -6,  12,  -6]],

       [[  6, -12,   6],
        [  6, -12,   6]]])

我重申 F 和 G 不是真正的函数,它应该适用于任意定义。我想要一个不使用我上面写的 for 循环的解决方案

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    你可以使用np.apply_along_axis:

    >>> np.apply_along_axis(lambda x: [F(x[0], x[1]), G(x[0], x[1])], 0, X)
    array([[[-4, -4],
            [-4, -4]],
    
           [[ 4,  4],
            [ 4,  4]]])
    >>> 
    

    这会将函数应用于 numpy 数组的每个子数组,就像原始 for 循环一样,它使用 lambda 将函数映射到值。

    编辑:

    你可以试试zipmap

    >>> np.array([*zip(*map(lambda x: [np.cross(x[0], x[1]), -np.cross(x[0], x[1])], zip(*X)))])
    array([[[ -6,  12,  -6],
            [ -6,  12,  -6]],
    
           [[  6, -12,   6],
            [  6, -12,   6]]])
    >>>
    

    【讨论】:

    • 这适用于函数FG 逐个元素地操作数组x 中的元素,在这种情况下,添加和减去向量的坐标。它不适用于一般转换
    • @Andrex general transformation 是什么意思?
    • @Andrex 我解决了你原来的问题,我想说你应该在这里标记这个并问一个新的
    • 没解决,打字说函数在np.ndarray中运行,返回np.ndarray。您的解决方案按元素运行。我将编辑我的问题。我认为解决方案与您写的很接近
    • @Andrex 您能否为您的新功能显示您想要的输出?
    猜你喜欢
    • 2014-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    • 2019-02-22
    • 2018-04-06
    • 2020-02-28
    • 2013-06-30
    相关资源
    最近更新 更多