将标准差函数转换为 numpy 形式

问题描述 投票:0回答:2

我想获得由数字定义的每第n个数字的标准差。因此它取列表中每 5 个数字的标准差。那么我怎样才能在下面的代码中将函数

std
转换为
np.std
的 numpy 格式。

import numpy as np
number = 5
list_= np.array([457.334015,424.440002,394.795990,408.903992,398.821014,402.152008,435.790985,423.204987,411.574005,
404.424988,399.519989,377.181000,375.467010,386.944000,383.614990,375.071991,359.511993,328.865997,
320.510010,330.079010,336.187012,352.940002,365.026001,361.562012,362.299011,378.549011,390.414001,
400.869995,394.773010,382.556000])
for i in range(len(list_)-number):
     y_mean = sum(list_[i:i+number])/number     
     #Standard Dev function = square root((first list value - y_mean)+(second list value - y_mean) + (third list value - y_mean)/n-1)
     std = (sum([(k - y_mean)**2 for k in list_[i:i+number]])/(number-1))**0.5
python function numpy math numpy-ndarray
2个回答
1
投票

我不确定您是否可以使用相同的

np.std
函数以这种特定方式提供服务,但您至少可以创建自己的函数来达到相同的效果。尝试使变量与函数同名可能会很棘手,因为它会给程序带来一些混乱。如果进行调整,您的代码可能会工作,但似乎没有必要,因为 numpy 已经在其库中内置了一个 std 函数。但是,如果您想创建一个自定义函数来查找每个第 N 个数字的标准差,您可以使用以下代码:

import numpy as np

data_set = np.array(
    [457.334015, 424.440002, 394.795990, 408.903992, 398.821014, 402.152008, 435.790985, 423.204987, 411.574005,
     404.424988, 399.519989, 377.181000, 375.467010, 386.944000, 383.614990, 375.071991, 359.511993, 328.865997,
     320.510010, 330.079010, 336.187012, 352.940002, 365.026001, 361.562012, 362.299011, 378.549011, 390.414001,
     400.869995, 394.773010, 382.556000])


def nthStd(x, number):
    std_dev_set = []
    for i in x[::+number-1]:
        std_dev_set.append(i)
    return std_dev_set

    

您可以调用该函数插入您要使用的数据集以及您要使用的第 N 个数字。然后,您可以将法线

np.std
应用于函数并返回标准差。

例如,调用该函数将如下所示并返回以下内容:

nthStd(data_set, 5)

OUTPUT: [457.334015, 398.821014, 411.574005, 375.46701, 359.511993, 336.187012, 362.299011, 394.77301]

返回的只是原始数据集中所有间隔为 N 的数字的列表。如果你想找到这些的标准差,你可以使用

np.std
函数,如下所示:

np.std(nthStd(data_set, 5))

或者,您也可以将

np.std
步骤放入函数本身以节省空间。这样函数就会返回标准差并且可以一起调用。

def nthStd(x, number):
    std_dev_set = []
    for i in x[::+number-1]:
        std_dev_set.append(i)
    return np.std(std_dev_set) 

nthStd(data_set, 5)

OUTPUT: 35.05640152471951

编辑:根据一些评论,听起来您希望迭代所有有效的 N 个数字对,因此 n 值为 2 的 [1,2,3,4,5,6] 列表将产生有效的列表[1,2] [2,3] [3,4] [4,5] [5,6],然后计算每个列表的标准差。可以通过添加另一个 for 循环来将这一更改添加到原始公式中,如下所示:

def nthStd(x, number):
    std_dev_set = []
    std_answer = []
    for k in range(0, len(x)+1-number):
        std_dev_set.clear()
        for i in x[k:number+k]:
            std_dev_set.append(i)
        std_answer.append(np.std(std_dev_set))
    return std_answer

1
投票

您想要测量的是特定窗口的滚动标准差。您可以将列表理解与

np.std
:

结合使用
>>> [list_[i:i+number].std() for i in range(0, len(list_)-number)]
[22.67653382706694,
 10.394077295510364,
 14.600764816599321,
 13.828019444486458,
 ...
 11.249337331453159,
 15.436611278024934,
 13.65945977634702]

编辑:您的实现不正确,std 定义为:

std = (sum([(k - y_mean)**2 for k in list_[i:i+number]])/number)**0.5

总和应除以

number
,因为
[i:i+number]
转换为间隔
[i:i+number[
,所以
[i,i+number-1]
即。
i+number-1-i+1=number
元素。

© www.soinside.com 2019 - 2024. All rights reserved.