値の2D配列とインデックスの1D配列があります。インデックスの配列を使用して、各行のインデックスから値を取得したいと思います。次のコードはこれを正常に実行します。
from pprint import pprint
import numpy as np
_2Darray = np.arange(100, dtype = np.float16)
_2Darray = _2Darray.reshape((10, 10))
array_indexes = [5,5,5,4,4,4,6,6,6,8]
index_values = []
for row, index in enumerate(array_indexes):
index_values.append(_2Darray[row, index])
pprint(_2Darray)
print index_values
戻り値
array([[ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.],
[ 10., 11., 12., 13., 14., 15., 16., 17., 18., 19.],
[ 20., 21., 22., 23., 24., 25., 26., 27., 28., 29.],
[ 30., 31., 32., 33., 34., 35., 36., 37., 38., 39.],
[ 40., 41., 42., 43., 44., 45., 46., 47., 48., 49.],
[ 50., 51., 52., 53., 54., 55., 56., 57., 58., 59.],
[ 60., 61., 62., 63., 64., 65., 66., 67., 68., 69.],
[ 70., 71., 72., 73., 74., 75., 76., 77., 78., 79.],
[ 80., 81., 82., 83., 84., 85., 86., 87., 88., 89.],
[ 90., 91., 92., 93., 94., 95., 96., 97., 98., 99.]], dtype=float16)
[5.0, 15.0, 25.0, 34.0, 44.0, 54.0, 66.0, 76.0, 86.0, 98.0]
しかし、私はnumpy関数のみを使用してそれを実行したいと思います。私はたくさんのnumpy関数を試しましたが、どれもこれをかなり単純なタスクで実行しているようには見えません。
前もって感謝します!
編集 私は自分の実装がどうなるかを理解することができました:V_high = np.fromiter((
index_values = _2Darray[ind[0], ind[1]] for ind in
enumerate(array_indexes)),
dtype = _2Darray.dtype,
count = len(_2Darray))
rootのおかげで、両方の実装がうまくいきました。ここで、いくつかのプロファイリングについて説明します。私の実装はcProfilerを介して実行されます
ncalls tottime percall cumtime percall filename:lineno(function)
2 0.274 0.137 0.622 0.311 {numpy.core.multiarray.fromiter}
20274 0.259 0.000 0.259 0.000 lazer_np.py:86(<genexpr>)
そしてルートの:
4 0.000 0.000 0.000 0.000 {numpy.core.multiarray.array}
1 0.000 0.000 0.000 0.000 {numpy.core.multiarray.arange}
信じられませんが、cProfilerはrootのメソッドを検出していません。これはある種のバグに違いないと思いますが、間違いなく著しく高速です。以前のテストでは、rootの速度が約3倍になりました。
注:これらのテストは、np.float16値のshape =(20273、200)配列で実行されました。さらに、各インデックス作成は、テストごとに2回実行する必要がありました。