私の最初に考えたのはありますa
を再形成するには、まず最初にn
の寸法は1になります。次に、各次元配列にf
を適用して、その次元を反復するだけです。結果をリスト(または適切なサイズの配列)で収集します。最後に形を変える。
x1...xn
の寸法はちょうどその通りです。
apply_along_axis
のコードを見てください。関数に渡されている軸を除くすべての軸を反復処理します。それはあなた自身の繰り返しでもできないことは何もしていません。 x1...xn
以上の反復処理を処理しますが、y
のサイズを1に縮小する必要があり、同じ形状を返す関数が必要です。
その関数のコアはoutarr
を適切なサイズにイニシャルされた
res = func1d(arr[tuple(i.tolist())], *args, **kwargs)
outarr[tuple(ind)] = res
であり、そしてind
は、(1を除く)すべての次元にわたってステップされます。それはres
が行くslice
オブジェクトを持っています。
=====================
2D入力配列で始まる簡単な例:
In [933]: def foo(arr):
...: return arr.reshape(2,-1)
...:
In [934]: source=np.arange(12).reshape(3,4)
In [935]: dest=np.zeros((source.shape[0],2,2),source.dtype)
In [936]: for i,r in enumerate(source):
...: dest[i,...] = foo(r)
...:
In [937]: dest
Out[937]:
array([[[ 0, 1],
[ 2, 3]],
[[ 4, 5],
[ 6, 7]],
[[ 8, 9],
[10, 11]]])
ように、この反復ソースの行を削除し、新しい配列を生成し、それらを宛先の適切な場所に挿入します。目的地を設定するには、foo
が(次元ごとに)何を生産するのかを知る必要があります。
In [938]: dest=[]
In [939]: for i,r in enumerate(source):
...: dest.append(foo(r))
In [940]: dest
Out[940]:
[array([[0, 1],
[2, 3]]), array([[4, 5],
[6, 7]]), array([[ 8, 9],
[10, 11]])]
In [941]: np.array(dest)
...
それは古い質問にダウンしています:
リストアペンドアプローチは、多くの知識を必要としない「私は関数から新しい配列を生成するのですか?」
['np.nditer'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html) – Eric
' np.ndindex'はあなたのものです部分的な反復が必要です。 – hpaulj
私が正しく理解していれば、これらの関数は繰り返し実行されるので、何とか手作業で必要な結果を構築する必要があります。実際、反復部分自体はforループと同じように簡単だと思われますが、numpyの複雑さに精通していない人にとっては、結果のコードがより明らかになるでしょうか? – gmr