【发布时间】:2021-06-09 16:10:06
【问题描述】:
我是 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 的例子:
| Index | Value |
|---|---|
| 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 :
| 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 |
我认为获取这个矩阵是否完整是我的问题的核心。 我现在可以计算距离(i),它是行和距离(i)*值(i)的总和:
| Index | distance | distance x Value |
|---|---|---|
| 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 |
最后我可以得到结果:
| Index | Value | Result |
|---|---|---|
| 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)
我仍然需要得到所选元素的总和
【问题讨论】:
-
如果您给我们一些示例输入和预期输出将会很有帮助。即使添加你的 for 循环方法也可以用于比较
-
我添加了一些解释和预期的行为