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

标签 python image matlab image-processing 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 在删除过程中如何处理数组存储。

相关往期帖子:
Removing rows in NumPy efficiently
Documentation for 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

关于python - 有效地删除 numpy 图像数组的行/列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14078818/

相关文章:

python - 如何通过循环嵌套字典和列表到字典?

python - 计算彼此之间具有最小和最大差异的唯一正整数的组合数?

iphone - 将图像发送到网络服务

matlab - 菲涅尔衍射分两步

matlab - 变量似乎在每次循环迭代时都会改变大小 - 什么?

python - 通过 django-admin 添加带有波兰标志的记录时出现操作错误

image - 无效的 JPEG 格式 : missing SOI marker

PHP 上传 IF ISSET 总是说是?

matlab - "RETURN"使用 "CurrentCharacter"按键返回空字符串

python - 如何在pytest中导入函数