您的问题当前的状态(可能随时更改):如何高效地从一个大数组的大数组中删除重复元素?
import numpy as np
rng = np.random.default_rng()
arr = rng.random((3000, 30000))
out1 = list(map(np.unique, arr))
out2 = [np.unique(subarr) for subarr in arr]
在IPython shell中的运行时:
>>> %timeit list(map(np.unique, arr))
5.39 s ± 37.9 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit [np.unique(subarr) for subarr in arr]
5.42 s ± 58.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
更新:正如
@hpaulj在他的评论中指出的那样,我的虚拟示例存在偏见,因为浮点随机数几乎肯定是唯一的。所以这里有一个更真实的整数示例:
>>> arr = rng.integers(low=1, high=15000, size=(3000, 30000))
>>> %timeit list(map(np.unique, arr))
4.98 s ± 83.7 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit [np.unique(subarr) for subarr in arr]
4.95 s ± 51.3 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
在这种情况下,输出列表的元素长度各不相同,因为存在需要移除的实际重复项。
x = np.array([[1, 2, 2.5],[12,35,12]])
都不应该花费19秒钟的时间。你能详细说明一下吗? - Andras Deak -- Слава Україніastype(set)
并不是你想象中的那样。numpy
没有set
数据类型,所以它只会返回一个object
数组。 - hpaulj