2

与えられた配列

d = np.random.randn(100)

およびインデックス配列

i = np.random.random_integers(low=3, high=d.size - 5, size=20)

r2次元配列を効率的に作成するにはどうすればよいですか

r.shape = (20, 8)

すべての人にとってj=0..19

r[j] = d[i[j]-3:i[j]+5]

私の場合、配列は非常に大きい (100 と 20 ではなく ~200000) ため、簡単な方法が役立ちます。

4

1 に答える 1

1

次のように、データのウィンドウビュー、つまり(93, 8)配列を作成できます。ここで、アイテム[i, j][i+j]元の配列のアイテムです。

>>> from numpy.lib.stride_tricks import as_strided
>>> wd = as_strided(d, shape=(len(d)-8+1, 8), strides=d.strides*2)

目的のスライスを次のように抽出できるようになりました。

>>> r = wd[i-3]

wdは元のデータの単なるビューであるため、余分なメモリは必要ありません。r任意のインデックスで抽出した瞬間、データがコピーされます。したがって、配列をどのように使用するかによって、それを可能な限り遅らせたり、完全に回避したりすることもできます。コピーをトリガーすることなく、rいつでも行r[j]としてアクセスできます。wd[j-3]

于 2013-03-20T16:05:26.420 に答える