0

以下の関数で「sortedlist」と呼ぶ 41000x3 numpy 配列があります。3 番目の列には一連の値があり、その中には重複しているものもあれば、そうでないものもあります。sortedlist[:,2] である 3 番目の列から一意の値 (重複なし) のサンプルを取得したいと思います。これは numpy.random.sample(sortedlist[:,2], sample_size) で簡単にできると思います。問題は、これらの値だけでなく、最後の列に numpy.random.sample から取得したランダムに選択された値がある 3 つの列すべてを返したいことです。

編集: 一意の値とは、一度だけ表示されるランダムな値を選択したいということです。したがって、配列がある場合:

array = [[0, 6, 2]
         [5, 3, 9]
         [3, 7, 1]
         [5, 3, 2]
         [3, 1, 1]
         [5, 2, 8]]

そして、3 番目の列の 4 つの値を選択したかったので、new_array_1 のようなものを取得したいと考えています。

new_array_1 = [[5, 3, 9]
               [3, 7, 1]
               [5, 3, 2]
               [5, 2, 8]]

しかし、3 列目の 2 つの値が同じである new_array_2 のようなものは必要ありません。

new_array_2 = [[5, 3, 9]
               [3, 7, 1]
               [5, 3, 2]
               [3, 1, 1]]

ランダムな値を選択するコードがありますが、3 番目の列で重複してはならないという基準はありません。

samplesize = 100

rand_sortedlist = sortedlist[np.random.randint(len(sortedlist), size = sample_size),:]]

このようなことをすることで、この基準を強制しようとしています

    array_index = where( array[:,2] == sample(SelectionWeight, sample_size) )

しかし、正しい軌道に乗っているかどうかはわかりません。どんな助けでも大歓迎です!

4

2 に答える 2

0

これを行うための巧妙な numpythonic の方法で、データに対する複数のパスを必要としないものは考えられません。(場合によっては、numpy が純粋な Python よりもはるかに高速であり、それが依然として最速の方法ですが、決して正しく感じることはありません。)

純粋なPythonでは、次のようなことをします

def draw_unique(vec, n):
    # group indices by value
    d = {}
    for i, x in enumerate(vec):
        d.setdefault(x, []).append(i)

    drawn = [random.choice(d[k]) for k in random.sample(d, n)]        
    return drawn

与えるだろう

>>> a = np.random.randint(0, 10, (41000, 3))
>>> drawn = draw_unique(a[:,2], 3)
>>> drawn
[4219, 6745, 25670]
>>> a[drawn]
array([[5, 6, 0],
       [8, 8, 1],
       [5, 8, 3]])

np.bincountandでいくつかのトリックを思いつくことができますscipy.stats.rankdataが、それらは頭を痛め、ベクトル化する方法がわかりません..そして、すべてをベクトル化していない場合は、使用したほうがよいかもしれません上記は少なくとも単純です。

于 2013-10-13T02:05:42.487 に答える