基本上我要做的是计算表格数组中每一行的标准差。我已经尝试了所有可以想象的但却无法让它正确执行。
数组看起来像这样
array = [
[ 4, 6, 1, -3,-12],
[ 9, 14, -4, 32, 0],
[ 22, -3, 12, -2, 8],
[ 4, 4, 4, 4, 4]]
python代码:
from file import array
for row in array:
mean=sum(row)/len(row)
print("Std Dev=",(sum( (x-mean)**2.0 for x in row ) / float(len(row)) )**0.5)
结果:
Std Dev= 6.368673331236263
Std Dev= 12.6237870704476
Std Dev= 9.28654941299512
Std Dev= 0.0
答案 0 :(得分:2)
已经有一个包可以做到这一点。获得array
的每一行的标准偏差:
In [16]: import numpy as np
In [17]: array = [
[ 4, 6, 1, -3,-12],
[ 10, 14, -4, 32, 0],
[ 22, -3, 10, -2, 8],
[ 3, 4, 4, 4, 2]]
In [18]: np.array(array).std(1)
Out[18]: array([ 6.37, 12.61, 9.12, 0.8 ])
顺便说一句,如果我们使用np.array(array).std(0)
,我们就会得到每列的标准偏差。
numpy
使用Python3并且没有导入的模块:
array = [
[ 4, 6, 1, -3,-12],
[ 10, 14, -4, 32, 0],
[ 22, -3, 10, -2, 8],
[ 3, 4, 4, 4, 2]]
for row in array:
mean=sum(row)/len(row)
print("Std Dev=",(sum( (x-mean)**2.0 for x in row ) / float(len(row)) )**0.5)
这会产生输出:
Std Dev= 6.368673331236263
Std Dev= 12.611106216347558
Std Dev= 9.121403400793104
Std Dev= 0.8
根据具体情况,标准差的公式可能在分母中有n
或n-1
,其中n
是数据点的数量。上面的计算使用n
。使用n-1
的解决方案如下:
array = [
[ 4, 6, 1, -3,-12],
[ 9, 14, -4, 32, 0],
[ 22, -3, 12, -2, 8],
[ 4, 4, 4, 4, 4]]
for row in array:
mean=sum(row)/len(row)
print("Std Dev=",(sum( (x-mean)**2.0 for x in row ) / float(len(row)-1) )**0.5)
这会产生结果:
Std Dev= 7.120393247567159
Std Dev= 14.11382301150188
Std Dev= 10.382677881933928
Std Dev= 0.0
答案 1 :(得分:0)
所以,问题实际上是你没有按照你的意愿行事。看看你的mean()
方法;你正在迭代数组。该数组的每个元素是什么? 一个数组本身。但是,作为函数的结果,您将返回第一个内部数组的平均值,因此您将获得表的一行的“平均值”,而不是基于行的长度而是表中的行数
尽管Python是动态类型的,但请尝试根据一系列转换来考虑您的代码。例如,mean()
方法(可能)是一个获取列表列表并返回单个整数作为整个表的值的方法。
答案 2 :(得分:0)
您的数组实际上是一个列表列表,因此您需要对其进行双重迭代。对于简单的2D情况,这将起作用:
import math
def total_2D(data):
return sum(sum(row) for row in data)
def length_2D(data):
return sum(len(row) for row in data)
def stDev_2D(data):
length = length_2D(data)
mean = total_2D(data) / length
diff_sqr = sum(sum((i - mean) ** 2 for i in row) for row in data)
return math.sqrt(diff_sqr / length)
data = [[1,2,3],[4,5,6]]
standard = stDev(data)
print(standard)
对于任意数量的维度,您可以更普遍地执行此操作:
import math
def list_total(data):
if hasattr(data[0], '__iter__'):
return sum(list_total(item) for item in data)
else:
return sum(data)
def list_len(data):
if hasattr(data[0], '__iter__'):
return sum(list_len(item) for item in data)
else:
return len(data)
def list_diffSqr(data, mean):
if hasattr(data[0], '__iter__'):
return sum(list_diffSqr(item, mean) for item in data)
else:
return sum((item - mean) ** 2 for item in data)
def list_stDev(data):
n = list_len(data)
mean = list_total(data) / n
return math.sqrt(list_diffSqr(data, mean) / n)
data = [[1,2,3],[4,5,6]]
standard = stDev(data)
print(standard)
请注意,这仅在深度一致时才有效。例如。 [[1,2],[3,4],[5,6]]
有效但[[1,2],3,[4,5]]
没有。
答案 3 :(得分:0)
让您的生活更轻松,并使用精湛的pandas套餐:
import numpy as np
import pandas as pd
df = pd.DataFrame( [[ 4, 6, 1, -3,-12],
[ 10, 14, -4, 32, 0],
[ 22, -3, 10, -2, 8],
[ 3, 4, 4, 4, 2]], columns=['foo','bar','baz','qux','cor'])
df['cor'].std()
>>> 8.3864970836060824