異なる次元の配列でそれを試してみてください。
1次元配列の場合は、それがどんな機能を追加しません:2D配列について
In [36]: A=np.arange(10)
In [38]: np.apply_along_axis(reverse_and_shift,-1,A)
Out[38]: array([0, 9, 8, 7, 6, 5, 4, 3, 2, 1])
In [39]: reverse_and_shift(A)
Out[39]: array([0, 9, 8, 7, 6, 5, 4, 3, 2, 1])
を、それは、第一次元上の反復に相当します(-1
)最後に関数を適用する:第1回2次元のすべての値の3Dそれを反復するために
In [41]: A=np.arange(9).reshape(3,3)
In [42]: np.apply_along_axis(reverse_and_shift,-1,A)
Out[42]:
array([[0, 2, 1],
[5, 4, 3],
[8, 7, 6]])
In [43]: reverse_and_shift(A[0,:])
Out[43]: array([0, 2, 1])
In [44]: reverse_and_shift(A[1,:])
Out[44]: array([5, 4, 3])
In [45]: reverse_and_shift(A[2,:])
Out[45]: array([8, 7, 6])
In [46]: np.array([reverse_and_shift(x) for x in A])
Out[46]:
array([[0, 2, 1],
[5, 4, 3],
[8, 7, 6]])
を、最後にあなたの関数を適用します。
In [48]: A=np.arange(8).reshape(2,2,2)
In [49]: np.apply_along_axis(reverse_and_shift,-1,A)
Out[49]:
array([[[0, 1],
[3, 2]],
[[5, 4],
[7, 6]]])
これらの値に対して独自の反復を行う方法はいくつかあります。最も簡単なの一つは、アプリケーション軸は最初、最後、またはある場合
In [50]: np.array([reverse_and_shift(x) for x in A.reshape(-1,2)])
Out[50]:
array([[0, 1],
[3, 2],
[5, 4],
[7, 6]])
In [51]: _.reshape(2,2,2)
Out[51]:
array([[[0, 1],
[3, 2]],
[[5, 4],
[7, 6]]])
この変形アプローチが最も簡単である(当時と)2dにアレイを再構築することです。中間軸に沿って適用したい場合は、最初にある軸をスワップし、その軸を最後に移動するほうが簡単でしょう。
apply_along_axis
はPythonで書かれていますので、読んで必要な部分を抽出することができます。すべての反復はPythonで行われるため、独自の反復を行うとパフォーマンスが低下することはありません。あなたの例の場合
=======================
、A
は3Dです。その形状を維持する
In [70]: A.shape
Out[70]: (1, 2, 5)
In [71]: np.apply_along_axis(reverse_and_shift,-1,A)
Out[71]:
array([[[0, 0, 3, 2, 1],
[0, 4, 3, 2, 1]]])
In [72]: _.shape
Out[72]: (1, 2, 5)
reshape反復の場合、後で追加する必要がある次元が削除されます。
In [73]: np.array([reverse_and_shift(x) for x in A.reshape(-1,A.shape[-1])])
Out[73]:
array([[0, 0, 3, 2, 1],
[0, 4, 3, 2, 1]])
In [74]: _.shape
Out[74]: (2, 5)
apply_along_axis
(おおよそ)
outarr=np.zeros_like(A)
for <all applicable i,j>:
ind = (i,j,slice(None))
outarr[ind] = reverse_and_shift(A[ind])
を行います