3

次元 (t、z、y、x) を表し、それぞれのインデックスを で表す配列 がGammaあります。(t,y,x) ごとに、そのようなの最小値を見つけたいと思います。ここで、は定数です。この最小値のセットを として示します。私はこれをうまく行うことができることを発見しましたGamma.shape=(20,7,90,144)[l,k,j,i]kGamma[l,k,j,i] > g_critg_critkk_low

k_low = np.argmax(Gamma > g_crit, axis=1)

z 次元にも対応する別の配列 がありlevsます。levs.shape=(7,)私は最終的に と のような配列を作成しようとしていlevs_lowます。私はこのステップで立ち往生しています。アイデアはありますか?ありがとう。levs_low.shape=(20,90,144)levs_low[l,j,i]=levs[k_low[l,j,i]]

4

2 に答える 2

4

np.take()あなたの場合、それは良い選択だと思われます:

levs_low = np.take( levs, k_low )

OBS:take最適化されたパフォーマンスが得られるようです。この質問を確認してください

于 2013-07-31T22:33:31.173 に答える
3

これでうまくいくはずです:

levs_low=levs[k_low]

>>> Gamma=np.random.rand(20,7,90,144)
>>> k_low = np.argmax(Gamma > .3, axis=1)
>>> levs=np.random.rand(7)
>>> levs_low=levs[k_low]
>>> levs_low.shape
(20, 90, 144)

小さな例:

>>> g=np.random.randint(0,5,(4,4))
>>> g
array([[2, 0, 2, 2],
       [2, 0, 1, 0],
       [3, 3, 0, 3],
       [3, 0, 4, 4]])
>>> k=np.arange(5)*-1
>>> k
array([ 0, -1, -2, -3, -4])
>>> k[g]   #Uses indices of g to select values from k. Also same as np.take(k,g)
array([[-2,  0, -2, -2],
       [-2,  0, -1,  0],
       [-3, -3,  0, -3],
       [-3,  0, -4, -4]])

@Saullo Castroの答えは興味深いです。ファンシー インデックス作成とnp.take.

%timeit levs[k_low]
100 loops, best of 3: 2.3 ms per loop

%timeit np.take( levs, k_low )
1000 loops, best of 3: 439 us per loop

In [33]: np.all(levs[k_low]==np.take(levs,k_low))
Out[33]: True
于 2013-07-31T22:33:20.300 に答える