4

私の問題のおもちゃケース:

サイズが numpy の配列、たとえば 1000 があります。

import numpy as np
a = np.arange(1000)

aから別の配列bへのマッピングである「射影配列」pもあります。

p = np.random.randint(0,1000,(1000,1000))

「派手なインデックス」を使用してaからbを取得するのは簡単です。

b = a[p]

ただし、以前のいくつかの質問/回答とnumpyのドキュメントで指摘されているように、bはビューではありません。

残念ながら、私の場合、長いシミュレーションの過程で変化する値だけが変化し、各反復で派手なインデックスを使用してbを取得すると、非常にコストがかかります。私はbから読み取るだけで、変更しません。

ファンシーなインデックス作成でこれを解決することは (まだ) 不可能であることを理解しています。

誰かが同様の問題/ボトルネックを抱えていて、他の回避策を思いついたのではないかと思っていましたか?

4

1 に答える 1

2

あなたが求めていることは実用的ではなく、それが多くの人々がそれを実装していない理由です。次のような方法で自分で行うことができます。

class FancyView(object):
    def __init__(self, array, index):
        self._array = array
        self._index = index.copy()
    def __array__(self):
        return self._array[self._index]
    def __getitem__(self, index):
        return self._array[self._index[index]]

b = FancyView(a, p)

ただし、配列としてa[p]使用するたびに、コストのかかる操作が呼び出されることに注意してください。bこの種の「ビュー」を作成する他の練習方法はありません。Numpyはストライドを操作できるため、基本的なスライスにビューを使用することを回避できますが、ストライドを使用してこのようなことを行う方法はありません。

一部のみが必要な場合はb、配列として使用する代わりに、ファンシービューにインデックスを付けることで、時間を節約できる可能性があります。

于 2012-04-04T21:27:27.497 に答える