使用Numpy加权数据

时间:2018-01-03 16:32:38

标签: python numpy average

我的数据如下:

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,我不知道如何处理最左边和最右边的点。

2 个答案:

答案 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