データを1000回複製せずに、別の1D配列を1000回連続して繰り返す1D NumPy配列を作成したいと思います。
出来ますか?
それが役立つ場合は、両方の配列を不変として扱うつもりです。
データを1000回複製せずに、別の1D配列を1000回連続して繰り返す1D NumPy配列を作成したいと思います。
出来ますか?
それが役立つ場合は、両方の配列を不変として扱うつもりです。
これはできません。NumPy 配列は各次元に沿って一貫したストライドを持つ必要がありますが、ストライドはほとんどの場合一方向に進む必要がありますが、逆方向にジャンプすることもあります。
取得できる最も近いものは、すべての行が最初の配列のビューである 1000 行の 2D 配列、または1D 配列のように動作するflatiter
objectです。(flatiter は反復とインデックス作成をサポートしますが、ビューを取得することはできません。すべてのインデックス作成でコピーが作成されます。)
設定:
import numpy as np
a = np.arange(10)
2D ビュー:
b = np.lib.stride_tricks.as_strided(a, (1000, a.size), (0, a.itemsize))
flatiter オブジェクト:
c = b.flat
broadcast_to
numpy 1.10 で追加されました。これにより、少ない労力で配列を効果的に繰り返すことができます。
受け入れられた回答のスタイルをコピーする:
import numpy as np
arr = np.arange(10)
repeated = np.broadcast_to(arr, (1000, arr.size))
「データを 1000 回複製しない」という意味が 100% わかりません。(ループではなく)一挙に構築するためのnumpyメソッドを探している場合は、次を使用できb
ます。a
a = np.arange(1000)
b = np.tile(a,1000)
そうでなければ、私は次のようなことをします:
a = np.arange(1000)
ii = [700,2000,10000] # The indices you want of the tiled array
b = a[np.mod(ii,a.size)]
b
派手なインデックス付け(コピーを作成する)のため、この場合のビューではありませんa
が、少なくともnumpy配列を返し、メモリに1000 * 1000x1配列を作成せず、必要な要素だけを含みます。
それらが不変である限り(Immutable numpy array?を参照)、コピーはフラグ設定を保持しないため、それぞれのフラグを個別に切り替える必要があります。
numpyをだましてオブジェクトの配列を作成する必要があるため、これが最も洗練されたソリューションであるとは言いません(コメント付きの行を参照してください)。
from numpy import array
n = 3
a = array([1,2])
a.setflags(write=False)
t = [a]*n + [array([1])] # Append spurious array that is not len(a)
r = array(t,dtype=object)
r.setflags(write=False)
assert id(a) == id(t[1]) == id(r[1])
これはうまくいきますか:
import numpy
a = numpy.array([1, 2, 3, 4])
b = numpy.ones((1000, a.shape[0]))
b *= a
b = b.flatten()