【发布时间】:2014-02-18 17:09:00
【问题描述】:
根据在另一个数组中找到的最接近的浮点数“过滤”一个数组时,我遇到了性能问题。
这是MWE的问题:
import numpy as np
def random_data(N):
# Generate some random data.
return np.random.uniform(0., 10., N).tolist()
# Data lists.
N1 = 1500
list1 = [random_data(N1), random_data(N1), random_data(N1)]
list2 = random_data(1000)
# Define list1's range.
min_1, max_1 = min(list1[2]), max(list1[2])
# This list will contain the "filtered" list1.
list4 = [[], [], []]
# Go through each element in list2.
for elem2 in list2:
# If it is located within the list1 range.
if min_1 <= elem2 <= max_1:
# Find the closest float in sub-list list1[2] to this float
# in list2.
indx, elem1 = min(enumerate(list1[2]), key=lambda x:abs(x[1]-elem2))
# Store the values in list1 that are associated with the closest float
# found above.
list4[0].append(list1[0][indx])
list4[1].append(list1[1][indx])
list4[2].append(elem1)
(注意list2 包含的元素少于list1[2],这是我比较的子列表)
此块按预期工作,但效率极低。我确信答案在于正确应用 broadcasting 和 numpy 数组,但我仍然没有设法掌握前者足以将其应用于我的问题。
由于我在增强此代码的性能之后,任何解决方案都可以做到(即:我不受必然使用广播的答案的约束)
添加
作为参考,在我前段时间Fast weighted euclidean distance between points in arrays 提出的类似问题中,用户ali_m 使用广播实现了惊人的性能提升。
问题并不完全相同(欧几里得距离而不是绝对值,而且该问题中的距离也必须加权),但在我看来,这个问题比那个问题更简单。
应用于该问题的广播解决方案 ali_m 不能应用于此问题吗?
添加 2 个
user2357112 给出的答案以及 Eelco Hoogendoorn 的更正对我最初定义的代码非常有效。我刚刚意识到我过度简化了它,在我的实际代码中,列表list1[2] 和list2 不一定在同一范围内定义。这将是一个更准确的表示(这应该替换上面MWE 中的第一行):
def random_data(N, xi, xf):
# Generate some random data.
return np.random.uniform(xi, xf, N).tolist()
# Data lists.
N1 = 1500
list1 = [random_data(N1, 13., 20.), random_data(N1, -1., 4.), random_data(N1, 2., 7.)]
list2 = random_data(1000, 0., 10.)
现在list1[2] 的范围不等于list2 的范围,因此给出的答案无法拒绝i 的list2[i] > max(list1[2]) 或list2[i] < min(list1[2]) 的那些点。
可以修改答案以考虑这种可能性吗?很抱歉把原来的代码改成这样,真的被我弄丢了。
【问题讨论】:
-
这可能属于 codereview ......但只是 2c 你为什么不排序 list1[2] 然后 min1,max1 是
[0]和[-1]......这会让你使用二进制搜索更快地找到最接近的值......我认为 -
@JoranBeasley 排序是
O(NlogN)与O(N)所花费的时间相比min,max。所以,min和max在这里会更快(至少理论上是这样)。并且二进制搜索在这里不起作用,因为 OP 正在寻找具有最小绝对差异的项目的索引。 -
好吧,公平点......看起来他仍然能够在排序列表中更快地找到 abs 差异......并且可能节省足够的时间来使排序值得......也许...
-
二分查找可以找到最小绝对差,没问题。
标签: python arrays performance algorithm numpy