[英]What is the fastest way to find the min and max value of a large multidimensional numpy array?
我有一个由 20,000 个 RGB 图像组成的 numpy 数组,每个 220x220 像素。 因此,数组X_data
的形状为(20000, 220, 220, 3)
。
我正在寻找在整个数据集中找到最小和最大像素值的最快方法。 我很欣赏这种类型的任务需要时间,因为我正在搜索大约 30 亿个像素值,但我希望改进我已经找到的解决方案; 以下是:
在结果数组上使用np.flatten
然后np.min
和np.max
:
flat = X_data.flatten()
np.min(flat)
np.max(flat)
此方法总共需要 13 分 11 秒(墙时间)来找到最小值和最大值。
使用np.amin
和np.amax
找到每个图像的最小值和最大值,将它们附加到列表中,然后找到该列表的最小值和最大值:
min_val = np.min([np.amin(X_data[i]) for i in np.arange(X_data.shape[0])])
max_val = np.max([np.amax(X_data[i]) for i in np.arange(X_data.shape[0])])
此方法总共耗时 8 分钟(挂墙时间)。
有没有更快的方法来完成这个任务?
我忘了在问题的原始表述中提到我希望这适用于尚未重新缩放的图像数据集,即那些包含不同大小图像的数据集。 这意味着使用np.min
和np.max
将不起作用,即使上述选项更快。
非常感谢!
由于flatten
会生成数据的副本,因此第一种方法较慢。 在您的情况下,数据很大,因此运行时的很大一部分将用于内存分配。
另一方面,默认情况下np.min
将检查所有轴,例如:
np.min([[1,2],[3,4]])
# out: 1
所以你可以这样做:
min_val, max_val = np.min(X_data), np.max(X_data)
应该更快。
如果最大速度很重要,那么添加一个可以同时获得最大值和最小值的库可能是值得的。 这样的例程只需要遍历大数组一次而不是两次。 由于在任何现代平台上获取这些值都完全受内存限制(计算量很小),因此将内存访问减半可能会使执行时间减半。 基本上,您可以用一个的价格获得两个值。
这个答案有一个链接到 Python 的 Fortran 实现,发现 Numpy 函数也太慢了。 但这是一个 8 年前的答案,在 Numpy 实现中情况可能有所改善。
DIPlib是一个图像处理库(我是作者),因为我已经安装了它,所以我很容易尝试它的函数来获取数组中的最大值和最小值。 我使用的数组比 OP 中的要小,我不想等那么久才能完成实验。 这是代码:
import numpy as np
import diplib as dip
import time
X = np.random.randn(2000, 220, 220, 3)
t = time.time()
np.min(X), np.max(X)
print(time.time() - t)
t = time.time()
dip.MaximumAndMinimum(X)
print(time.time() - t)
3 次运行的中位数(不改变X
数组)第一部分为 0.361s,第二部分为 0.135s。
找到最大值(或最小值)需要对值进行排序。 当两个都需要,调用np.max()
然后np.min()
使得它的排序值的两倍...
我更喜欢简单地使用这个:
the_min, the_max = np.percentile(my_data,[0,100])
只对数据进行一次排序...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.