首页 > 解决方案 > 使用 numpy 计算值之间距离的平方和

问题描述

我是python和stackoverflow的新手。我正在尝试改变我对循环的思考方式。我有一系列类型为 <class 'pandas.core.series.Series'> 的值。

目标:给出深度 n,我想计算每个值(第一个 2*n-2 除外):

result(i) = sum[j=0 to n-1](distance(i-j)*value[i-j])/sum[j=0 to n-1](distance[j])

with distance(i) = sum[k=1 to n-1]((value[i]-value[i-k])^2)

我想避免循环,那么有没有更好的方法来使用 numpy 实现我的目标?

编辑:好的,看来我不是很清楚,所以这里有一个 n= 4 的例子:

指数 价值
0 2
1 4
2 5
3 3
4 1
5 8
6 9
7 4
8 2
9 1
10 7

然后我计算平方差 (value[i]-value[j])^2 with j=i-1 to i-3 :

差异² 0 1 2 3 4 5 6 7 8 9 10
0
1
2
3 1 1 4
4 9 16 4
5 9 25 49
6 36 64 1
7 9 16 25
8 36 49 4
9 64 9 1
10 9 25 36

我认为获得这个矩阵,是否完整是我问题的核心。我现在可以计算 distance(i) ,它是一行和 distance(i)*value(i) 的总和:

指数 距离 距离 x 值
0
1
2
3 6 18
4 29 29
5 83 664
6 101 909
7 50 200
8 89 178
9 74 74
10 70 490

最后我可以得到结果:

指数 价值 结果
0 2
1 4
2 5
3 3
4 1
5 8
6 9 7.397260274
7 4 6.851711027
8 2 6.040247678
9 1 4.334394904
10 7 3.328621908

例如 :

result(10) = (distance(10)*value(10)+distance(9)*value(9)+distance(8)*value(8)+distance(7)*value(7))/(distance(10)+distance(9)+distance(8)+distance(7))

如果需要,我有该算法的 Java 版本。谢谢你。

更新:我终于找到了如何获得完整的平方差矩阵:

import numpy as np
import pandas as pd

n=4
myseries=pd.Series([2, 4, 5, 3, 1, 8, 9, 4, 2, 1, 7])
l=len(myseries)

vector = np.repeat(myseries, l)
mat = vector.to_numpy().reshape((l, l))
diff = mat-np.transpose(mat)

squared_diff = np.multiply(diff, diff)

print(squared_diff)

我仍然必须得到所选元素的总和

标签: pythonpandasnumpy

解决方案


你可以这样做:

myseries = pd.Series(np.random.rand(100), dtype='float32')

sum_of_squared_distances= np.sum(np.square(np.diff(myseries.values[:n][1::2])))

其中“n”是第 n 个索引(深度),而 [1::2] 部分仅获取奇数索引值,因为您只需要对应于奇数索引的值(2*n-2 除外)


推荐阅读