我不知道有什么通用的方法可以将函数应用于N-D数组的切片。但是有两种方法可以解决这个问题。
如果您想在每个2D切片的每行或每列上应用1D导数,则相当于将导数应用于每个1D切片,您可以使用np.apply_along_axis:
values = np.arange(4)*np.arange(3)[:, None]+np.arange(2)[:, None, None]*2
>>> array([[[0, 0, 0, 0],
[0, 1, 2, 3],
[0, 2, 4, 6]],
[[2, 2, 2, 2],
[2, 3, 4, 5],
[2, 4, 6, 8]]])
np.apply_along_axis(np.gradient, 2, values)
>>> array([[[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.]],
[[ 0., 0., 0., 0.],
[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.]]])
这将区分每个2D切片的行。要区分每一列,请使用np.apply_along_axis(np.gradient, 2, values)
如果您想要执行需要两个维度的操作,通常可以通过广播和轴参数来完成。例如,如果您想要对每个切片V
执行V[i, j] = sqrt((V[i,j]-V[i, j-1])^2+V[i, j]-V[i-1, j])^2
,则可以执行以下操作:
xdiffs = np.zeros_like(values)
xdiffs[:, 1:, :]= np.diff(values, axis=1)
ydiffs = np.zeros_like(values)
ydiffs[:, :, 1:] = np.diff(values, axis=2)
diffnorms = np.linalg.norm(xdiffs, ydiffs)
>>> array(
[[[ 0. , 0. , 0. , 0. ],
[ 0. , 1.41421356, 2.23606798, 3.16227766],
[ 0. , 2.23606798, 2.82842712, 3.60555128]],
[[ 0. , 0. , 0. , 0. ],
[ 0. , 1.41421356, 2.23606798, 3.16227766],
[ 0. , 2.23606798, 2.82842712, 3.60555128]]])
调整尺寸有点繁琐,但通常是最有效的解决方案。
这个示例在边界处使用零,如果需要其他内容,则需要将normdiff [:,:,0]
和normdiff [:,0,:]
设置为正确的边界值。
for bar2D in bar3D
可以给我每个2D切片)。我想做的是对每个2D切片应用一个函数,并从中创建一个新数组。 - Yossariana
形状相同的数组,比如b
,然后用b[x,:,:]=yourfunc(a[x,:,:])
替换print a[x,:,:]
。 - Lee