3

array.resize(shape)配列のサイズを変更し、それらのインデックスに値なしでゼロを追加するために使用できます。私の配列が[1,2,3,4]あり、私が使用する場合、私はarray.resize[5,0]取得し[1,2,3,4,0]ます。先頭にゼロを追加/パディングして、降伏させるにはどうすればよい[0,1,2,3,4]ですか?

私はこれを動的に行っています-使用しようとしています:

array.resize(arrayb.shape)

配列のメモリ内コピーを作成することは (どうしても) 避けたいと思います。つまり、配列を反転し、サイズを変更して、再び反転します。ビューで作業するのが理想的です。

4

2 に答える 2

3

負のストライドで配列を操作してみることができます (ただし、サイズ変更でコピーを作成する必要がないかどうかはわかりません)。

_a = np.empty(0) # original array
a = _a[::-1] # the array you work with...

# now instead of a, resize the original _a:
del a # You need to delete it first. Or resize will want refcheck=False, but that
      # will be dangerous!
_a.resize(5)
# And update a to the new array:
a = _a[::-1]

しかし、可能な限り配列を十分に大きくすることをお勧めします。これはあまり美しくはありませんが、これがデータをコピーする唯一の方法だと思います。配列にも負のストライドがあるため、連続していないため、配列で使用する関数がコピーを作成する必要があることを意味する場合は、運が悪いです。

また、スライスするか、aサイズを変更する前にそれらを削除する必要があります。これを与えることはできますが、データが無効になるようです。_acopyrefcheck=False

于 2012-09-04T20:50:45.833 に答える
2

これを行うには、スライス割り当てを使用できると思います。numpy必要なオーバーラップのチェックを行う限り、このような操作のためにコピーを作成する必要がある理由はわかりません(もちろん、他の人が指摘したように、resizeそれ自体が新しいメモリブロックを割り当てる必要があるかもしれません)。このメソッドを非常に大きな配列でテストしましたが、メモリ使用量の急増は見られませんでした。

>>> a = numpy.arange(10)
>>> a.resize(15)
>>> a[5:] = a[:10]
>>> a[0:5] = 0
>>> a
array([0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

以下は、割り当て操作のメモリ使用量にジャンプがないことを示しています。

>>> a = numpy.arange(100000000)
>>> a.resize(150000000)
>>> a[50000000:] = a[:100000000]

より良い方法を知りません。これは単なる推測です。うまくいかない場合はお知らせください。

于 2012-09-04T19:05:05.877 に答える