2

私はndarrayを持っています。この配列から、最大値を持つN個の数値のリストを選択する必要があります。heapq.nlargestN個の最大のエントリが見つかりましたが、インデックスを抽出する必要があります。最初の列の重みが最大のN行のみが存続する新しい配列を作成したいと思います。残りの行はランダムな値に置き換えられます

import numpy as np
import heapq   # For choosing list of max values
a = [[1.1,2.1,3.1], [2.1,3.1,4.1], [5.1,0.1,7.1],[0.1,1.1,1.1],[4.1,3.1,9.1]]
a = np.asarray(a)
maxVal = heapq.nlargest(2,a[:,0])

if __name__ == '__main__':
    print a
    print maxVal

私が持っている出力は次のとおりです。

[[ 1.1  2.1  3.1]
[ 2.1  3.1  4.1]
[ 5.1  0.1  7.1]
[ 0.1  1.1  1.1]
[ 4.1  3.1  9.1]]

[5.0999999999999996, 4.0999999999999996]

しかし、私が必要と[2,4]しているのは、新しい配列を構築するためのインデックスとしてです。インデックスは行であるため、この例で残りを0に置き換えたい場合は、次のように終了する必要があります。

[[0.0  0.0  0.0]
[ 0.0  0.0  0.0]
[ 5.1  0.1  7.1]
[ 0.0  0.0  0.0]
[ 4.1  3.1  9.1]]

インデックスが必要なところに行き詰まっています。元の配列には1000行と100列があります。重みは正規化された浮動小数点であり、重みが非常に近く、元のNよりもif a[:,1] == maxVal[0]:多くの値で終了することがあるため、このようなことはしたくありません。maxVal[0]

このセットアップでインデックスを抽出して、配列の残りの部分を置き換える簡単な方法はありますか?

4

1 に答える 1

4

1000 行しかない場合は、ヒープを忘れnp.argsortて最初の列で使用します。

>>> np.argsort(a[:,0])[::-1][:2]
array([2, 4])

すべてをまとめたい場合は、次のようになります。

def trim_rows(a, n) :
    idx = np.argsort(a[:,0])[:-n]
    a[idx] = 0

>>> a = np.random.rand(10, 4)
>>> a

array([[ 0.34416425,  0.89021968,  0.06260404,  0.0218131 ],
       [ 0.72344948,  0.79637177,  0.70029863,  0.20096129],
       [ 0.27772833,  0.05372373,  0.00372941,  0.18454153],
       [ 0.09124461,  0.38676351,  0.98478492,  0.72986697],
       [ 0.84789887,  0.69171688,  0.97718206,  0.64019977],
       [ 0.27597241,  0.26705301,  0.62124467,  0.43337711],
       [ 0.79455424,  0.37024814,  0.93549275,  0.01130491],
       [ 0.95113795,  0.32306471,  0.47548887,  0.20429272],
       [ 0.3943888 ,  0.61586129,  0.02776393,  0.2560126 ],
       [ 0.5934556 ,  0.23093912,  0.12550062,  0.58542137]])
>>> trim_rows(a, 3)
>>> a

array([[ 0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.84789887,  0.69171688,  0.97718206,  0.64019977],
       [ 0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.79455424,  0.37024814,  0.93549275,  0.01130491],
       [ 0.95113795,  0.32306471,  0.47548887,  0.20429272],
       [ 0.        ,  0.        ,  0.        ,  0.        ],
       [ 0.        ,  0.        ,  0.        ,  0.        ]])

そして、あなたのデータサイズでは、おそらく十分に高速です:

In [7]: a = np.random.rand(1000, 100)

In [8]: %timeit -n1 -r1 trim_rows(a, 50)
1 loops, best of 1: 7.65 ms per loop
于 2013-02-27T23:18:48.190 に答える