2016-10-21 1 views
2

私は形状の配列と形状(200,200)の配列に形状(100000,)の配列をとる関数fを持っています。それぞれの行にfを適用して形状の配列を得る最も簡単な方法は何ですか (10,200,200)apply_along_axisを使用したいと思っていましたが、出力の次元数がfのものが入力の次元数よりも高いために動作しないようです。関数がより高次の配列を返すときnumpy apply_along_axisを行う方法?

(より一般的には、形状(x1,...,xn,y1,...,ym)の配列aと形状(z1,...,zp)の配列に形状(y1,...,ym)の配列を取る関数f与えられた、あなたはのすべての設定のために、aの最後m寸法にfを適用したい場合があります形状(x1,...,xn,z1,...,zp)の配列を取得するためにaの最初n寸法、。それとも、このフォームのいずれかに置き換えることができる問題がある可能性があります。このような変換を行うための最善の方法は何ですか?)

+0

['np.nditer'](https://docs.scipy.org/doc/numpy/reference/generated/numpy.nditer.html) – Eric

+1

' np.ndindex'はあなたのものです部分的な反復が必要です。 – hpaulj

+0

私が正しく理解していれば、これらの関数は繰り返し実行されるので、何とか手作業で必要な結果を構築する必要があります。実際、反復部分自体はforループと同じように簡単だと思われますが、numpyの複雑さに精通していない人にとっては、結果のコードがより明らかになるでしょうか? – gmr

答えて

1

私の最初に考えたのはあります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) 
... 

それは古い質問にダウンしています:

リストアペンドアプローチは、多くの知識を必要としない「私は関数から新しい配列を生成するのですか?」

関連する問題