如何在Python中寻找距离度量

4

这是数组。

arr=[1,2,2,1,5,1]

我需要计算索引之间的绝对值差,用于比较与其他元素相同值的情况,如下所述。
distance metric for a[0] = |0-3|+|0-5|=8
distance metric for a[1] = |1-2|=1
distance metric for a[2] = |2-1|=1
distance metric for a[3] = |3-0|+|3-5|=5
distance metric for a[4] = 0
distance metric for a[5] = |5-0|+|5-3|=7

输出结果为:

[8,1,1,5,0,7]

有人能帮忙用Python编写这个吗?

2个回答

6
您可以使用这个可工作的例子:
arr=[1,2,2,1,5,1]
res = []
for i, n in enumerate(arr):
    val = 0
    occur = [j for j, x in enumerate(arr) if x == n and j != i]
    for o in occur:
        val += abs(i-o)
    res.append(val)
print(res)

[8, 1, 1, 5, 0, 7]

使用O(n**2)的复杂度来实现更高效的版本。

arr=[1,2,2,1,5,1]
res = []
for i, n in enumerate(arr):
    val = 0
    for j, x in enumerate(arr):
        if x == n and j != i:
            val += abs(i-j)
    res.append(val)
print(res)

StackOverflow不是一个代码编写服务 @Jennie - TheEagle
我同意,但我需要通过这个小练习来清理一下我的头脑,如果我能帮助到别人...这并不可怕 (: - Green
它主要是针对OP的意思。 - TheEagle
我添加了一个更高效的版本示例,你可以使用numpy使其更加高效。但我猜这可能会过度优化。 - Green
这个函数我真的不太清楚,我会更深入地研究它。你能帮我看看怎么用numpy写吗? - Jennie
显示剩余6条评论

5
使用列表推导式并避免中间变量
arr = [1, 2, 2, 1, 5, 1]

output = []
for index in range(len(arr)):
    output.append(sum(abs(index - k) if arr[k] == arr[index] else 0 for k in range(len(arr))))

print(output)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接