我不知道的應用功能的ND切片任何通用的方法陣列。但有兩種方法可以解決這個問題。
如果你想要做的是在每個二維切片的每一行或列應用一維導數,這相當於應用衍生到各個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[i, j] = sqrt((V[i,j]-V[i, j-1])^2+V[i, j]-V[i-1, j])^2
每個切片V
你可以這樣做:
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, :]
到正確的邊界值。
對不起,這不是我所追求的。我知道如何切片(bar2D中的bar2D給我每個2D切片)。我想要做的是對每個2D切片應用一個函數,並從中創建一個新的數組。 – Yossarian
你可以創建另一個與'a'形狀相同的數組,例如'b',然後代替'print a [x,:,]',做'b [x,:,] = yourfunc (一[X,:,:])'。 – atomh33ls
這相當於我目前正在做的事情。實際上,它比列表理解還要慢。我正在尋求一種有效的方法來爲大型3D陣列做到這一點。 – Yossarian