0

値の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回実行する必要がありました。

4

3 に答える 3

5

これはそれを行う必要があります:

row = numpy.arange(_2Darray.shape[0])
index_values = _2Darray[row, array_indexes]

Numpyを使用すると、次のような2つの配列で2D配列(または実際にはnd配列)にインデックスを付けることができます。

for i in range(len(row)):
    result1[i] = array[row[i], col[i]]

result2 = array[row, col]
numpy.all(result1 == result2)
于 2013-03-08T05:24:43.027 に答える
3
In [15]: _2Darray[np.arange(len(_2Darray)), [5,5,5,4,4,4,6,6,6,8]]
Out[15]: array([  5.,  15.,  25.,  34.,  44.,  54.,  66.,  76.,  86.,  98.],
         dtype=float16)

しかし、私はあなたの解決策に基づく何かが実際には小さなアレイでより速いかもしれないと思います。配列がインデックスを100*100使用するよりも大きい場合。numpy

In [22]: def f(array, indices):
    ...:     return [array[row, index] for row, index in enumerate(indices)]

In [23]: f(_2Darray, [5,5,5,4,4,4,6,6,6,8])
Out[23]: [5.0, 15.0, 25.0, 34.0, 44.0, 54.0, 66.0, 76.0, 86.0, 98.0]

In [27]: %timeit f(_2Darray,[5,5,5,4,4,4,6,6,6,8])
100000 loops, best of 3: 7.48 us per loop

In [28]: %timeit _2Darray[np.arange(len(_2Darray)), [5,5,5,4,4,4,6,6,6,8]]
10000 loops, best of 3: 24.2 us per loop
于 2013-03-08T05:26:10.150 に答える
0

行列はなく、配列用に設計された特にnumpy関数を使用するように注意する必要があります。この2つは混同しやすく、一方のメソッドがもう一方のメソッドで呼び出されてもエラーは発生しませんが、出力はほとんど予測できません。

于 2013-03-08T05:12:00.733 に答える