有效地删除numpy图像数组的行/列



我试图从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

文档

为什么不直接做切片呢?这里我删除了前3000列,而不是16列,以使内存使用情况更清楚:

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

最新更新