2

Numpy 配列で表される画像から行または列を削除しようとしています。私の画像は uint16 型で 2560 x 2176 です。例として、最初の 16 列を削除して 2560 x 2160 にしたいとします。

私は MATLAB から Numpy への変換者であり、MATLAB では次のようなものを使用します。

A = rand(2560, 2196);
A(:, 1:16) = [];

私が理解しているように、これにより列が削除され、新しい配列にコピーしないことで多くの時間を節約できます。

Numpy の場合、以前の投稿では のようなコマンドを使用していましnumpy.deleteた。ただし、ドキュメントには、これがコピーを返すことが明確に記載されているため、コピーを A に再割り当てする必要があります。これは、コピーに多くの時間を浪費するようです。

import numpy as np

A = np.random.rand(2560,2196)
A = np.delete(A, np.r_[:16], 1)

これは本当にインプレース削除と同じくらい高速ですか? より良い方法がないか、Pythonが削除中に配列ストレージを処理する方法を理解していないに違いないと感じています。

関連する以前の投稿:
NumPy の行を効率的に削除
する numpy.delete のドキュメント

4

1 に答える 1

6

なぜスライスをしないのですか?ここでは、メモリ使用量をより明確にするために、16 列ではなく最初の 3000 列を削除しています。

import numpy as np
a = np.empty((5000, 5000)
a = a[:, 3000:]

これにより、メモリ内の配列のサイズが効果的に縮小されます。

In [31]: a = np.zeros((5000, 5000), dtype='d')
In [32]: whos
Variable   Type       Data/Info
-------------------------------
a          ndarray    5000x5000: 25000000 elems, type `float64`, 200000000 bytes (190 Mb)
In [33]: a = a[:, 3000:]
In [34]: whos
Variable   Type       Data/Info
-------------------------------
a          ndarray    5000x2000: 10000000 elems, type `float64`, 80000000 bytes (76 Mb)

このサイズの配列の場合、スライスは削除オプションよりも約 10,000 倍速いようです。

%timeit a=np.empty((5000,5000), dtype='d');  a=np.delete(a, np.r_[:3000], 1)
1 loops, best of 3: 404 ms per loop
%timeit a=np.empty((5000,5000), dtype='d');  a=a[:, 3000:]
10000 loops, best of 3: 39.3 us per loop
于 2012-12-29T06:18:24.280 に答える