我是 Python 和 stackoverflow 的新手。我正在尝试改变我对循环的看法。
我有一系列类型为
目标:给出深度 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 |
然后我用 j=i-1 到 i-3 计算平方差 (value[i]-value[j])^2 :
diff² | 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)
我仍然需要获取所选元素的总和
答案 0 :(得分:0)
你可以这样做:
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 除外)