nic*_*ale 2 python matlab numpy image image-processing
我试图从Numpy数组表示的图像中删除行或列.我的图片类型为uint16和2560 x 2176.举个例子,假设我要删除前16列,使其成为2560 x 2160.
我是MATLAB-to-Numpy转换器,在MATLAB中会使用类似的东西:
A = rand(2560, 2196);
A(:, 1:16) = [];
Run Code Online (Sandbox Code Playgroud)
据我了解,这将删除列,并通过不复制到新数组节省大量时间.
对于Numpy,以前的帖子使用了像numpy.delete.但是,文档很清楚,这会返回一个副本,所以我必须将副本重新分配给A.这似乎会浪费很多时间复制.
import numpy as np
A = np.random.rand(2560,2196)
A = np.delete(A, np.r_[:16], 1)
Run Code Online (Sandbox Code Playgroud)
这真的和就地删除一样快吗?我觉得我必须错过一个更好的方法或不了解python如何在删除期间处理数组存储.
相关的先前帖子:有效
删除NumPy中的行
numpy.delete的文档
为什么不做一片?在这里,我将删除前3000列而不是16列,以使内存使用更加清晰:
import numpy as np
a = np.empty((5000, 5000)
a = a[:, 3000:]
Run Code Online (Sandbox Code Playgroud)
这可以有效地减少内存中阵列的大小,如下所示:
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)
Run Code Online (Sandbox Code Playgroud)
对于此大小的数组,切片似乎比删除选项快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
Run Code Online (Sandbox Code Playgroud)