【发布时间】: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),其中x 和y 是长度为m 的一维数组,这些函数也返回形状为m 的一维数组。我想对X 应用转换,在第二个轴上操作,使用F 和G
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]]])
假设 F 和 G 由(虚拟函数这些不是真实的)定义
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.cross、G = -F 和X =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 循环的解决方案
【问题讨论】: