我的数据如下:
list
对于i*([i+1]+[i-1])/2
中的每个元素,我想取weights=[]
weights.append(1)
for i in range(len(hoff[3])-1):
weights.append((hoff[3][i-1]+hoff[3][i+1])/2)
,其中i是列表中的元素,而i + 1和i-1是相邻元素。
出于某种原因,我似乎无法在NumPy中干净地做到这一点。
这是我尝试过的:
Intent browserIntent = new Intent("android.intent.action.VIEW", Uri.parse("http://www.google.com")); startActivity(browserIntent);
我将1添加到权重列表中,以便长度在末尾匹配。我随意选择了1,我不知道如何处理最左边和最右边的点。
答案 0 :(得分:0)
我会为此使用pandas,用1填充缺少的最左边和最右边的值(但你可以使用你想要的任何值):
import numpy
import pandas
numpy.random.seed(0)
data = numpy.random.randint(0, 10, size=15)
df = (
pandas.DataFrame({'hoff': data})
.assign(before=lambda df: df['hoff'].shift(1).fillna(1).astype(int))
.assign(after=lambda df: df['hoff'].shift(-1).fillna(1).astype(int))
.assign(weight=lambda df: df['hoff'] * df[['before', 'after']].mean(axis=1))
)
print(df.to_string(index=False)
这让我:
hoff before after weight
5 1 0 2.5
0 5 3 0.0
3 0 3 4.5
3 3 7 15.0
7 3 9 42.0
9 7 3 45.0
3 9 5 21.0
5 3 2 12.5
2 5 4 9.0
4 2 7 18.0
7 4 6 35.0
6 7 8 45.0
8 6 8 56.0
8 8 1 36.0
1 8 1 4.5
基于纯numpy
的解决方案看起来像这样(再次填充1):
before_after = numpy.ones((data.shape[0], 2))
before_after[1:, 0] = data[:-1]
before_after[:-1, 1] = data[1:]
weights = data * before_after.mean(axis=1)
print(weights)
array([ 2.5, 0. , 4.5, 15. , 42. , 45. , 21. , 12.5, 9. ,
18. , 35. , 45. , 56. , 36. , 4.5])
答案 1 :(得分:0)
您可以使用numpy的数组操作来表示“循环”。如果您认为数据如下:pL和pR是您选择在左侧和右侧“填充”数据的值:
[pL, 0, 1, 2, ..., N-2, N-1, pR]
你要做的是:
[0, ..., N - 1] * ([pL, 0, ..., N-2] + [1, ..., N -1, pR]) / 2
用代码编写它看起来像这样:
import numpy as np
data = np.random.random(10)
padded = np.concatenate(([data[0]], data, [data[-1]]))
data * (padded[:-2] + padded[2:]) / 2.
重复第一个和最后一个值在图像处理中称为“扩展”,但您可以尝试其他edge handling methods。