【发布时间】:2021-02-05 15:52:10
【问题描述】:
我有一个长度为 N 的一维 Numpy 数组 A。对于数组中的每个元素x,我想知道数组中所有元素在[x-eps; 范围内的比例是多少? x+eps],其中eps 是一个常数。 N 大约是 15,000 个。
目前我是这样做的(最小例子):
import numpy as np
N = 15000
eps = 0.01
A = np.random.rand(N, 1)
prop = np.array([np.mean((A >= x - eps) & (A <= x + eps)) for x in A])
.. 在我的电脑上大约需要 1 秒。
我的问题:有没有更有效的方法?
编辑:我认为 cmets 中的@jdehesa 建议如下:
prop = np.isclose(A, A.T, atol=eps, rtol=0).mean(axis=1)
这是一个不错的简洁解决方案,但没有速度优势(在我的计算机上)。
【问题讨论】:
-
感谢您的建议。请参阅我的编辑以尝试通过
np.isclose实现它。 -
另一种选择是对数组进行排序 (O(n log n)),然后运行滑动窗口 (O(n)),计算窗口内的元素。与 O(n^2) 解决方案相比,总共将为 O(n log n),但无法有效矢量化,因此在 15k 数组上可能会更慢
标签: python arrays performance numpy scientific-computing