1

このチュートリアルの演習では、次のように述べています。

乱数の10x3配列を生成します(範囲内[0,1])。各行について、に最も近い番号を選択し0.5ます。

absおよびを使用して、各行に最も近いargsort列を検索しますj

ファンシーインデックスを使用して数値を抽出します。(ヒント:a[i,j]–配列iには、の内容に対応する行番号が含まれている必要がありますj。)

だから私はすべてをやりましたが、私が使用したスライス方法(およびの初期化b)はまったくpythonicではないと感じています:

a = np.random.rand(10,3)

mask = np.argmin(abs(a-0.5), axis = 1)

b = np.ones(mask.size)

for j in range(0,mask.size):
    b[j] = a[j,mask[j]]

forループを使用せずにこれを行う他の方法は何ですか?

4

2 に答える 2

5
import numpy as np
a = np.random.rand(10,3)
b = np.argmin(abs(a - .5), axis=1).choose(a.T)

# a
array([[ 0.97272372,  0.45351387,  0.19105835],
       [ 0.27895897,  0.12438789,  0.64857335],
       [ 0.05298066,  0.58122882,  0.805319  ],
       [ 0.39952727,  0.77728036,  0.65742471],
       [ 0.36522802,  0.06938552,  0.6595684 ],
       [ 0.9030323 ,  0.08965774,  0.01823633],
       [ 0.30996923,  0.53400339,  0.87600912],
       [ 0.17953532,  0.4888832 ,  0.0746074 ],
       [ 0.09052476,  0.47397504,  0.30317449],
       [ 0.31851577,  0.68135476,  0.38335483]])

# b
array([ 0.45351387,  0.64857335,  0.58122882,  0.39952727,  0.36522802,
        0.9030323 ,  0.53400339,  0.4888832 ,  0.47397504,  0.38335483])
于 2012-06-20T10:58:24.333 に答える
0

技術的にforループを回避するわけではありませんが、より Pythonic に記述する方法は、最初のnp.ones割り当てを回避し、リスト内包表記を使用することです。

b = [a[j, mask[j]] for j in range(0, mask.size)]
于 2012-06-20T10:47:46.393 に答える