Python 3.x NumPy:如何使用np.var和手工计算二维数组中每一行的方差(即,不使用np.var;显式计算每一项)?

Python 3.x NumPy:如何使用np.var和手工计算二维数组中每一行的方差(即,不使用np.var;显式计算每一项)?,python-3.x,numpy,loops,statistics,variance,Python 3.x,Numpy,Loops,Statistics,Variance,我正在使用Python从大文件导入数据。有三列对应于x、y、z数据。每行表示收集数据的时间。例如: importedData = [[1, 2, 3], <--This row: x, y, and z data at time 0. [4, 5, 6], [7, 8, 9]]; 我试过各种各样的东西。例如,将函数放入循环中,我第一次尝试仅获取行平均值: for row in importedData: mean_

我正在使用Python从大文件导入数据。有三列对应于x、y、z数据。每行表示收集数据的时间。例如:

importedData = [[1, 2, 3],  <--This row: x, y, and z data at time 0.
                [4, 5, 6],
                [7, 8, 9]];
我试过各种各样的东西。例如,将函数放入循环中,我第一次尝试仅获取行平均值:

for row in importedData:
    mean_test = np.mean(importedData,axis=1)
print(mean_test)
这给了我一个我无法理解的错误:


如果有人能为我指出正确的方向,我将不胜感激。

好吧,你可以这样做,让事情更加明确:

将numpy导入为np
导入数据=np.arange(1,10).重塑(3,3)
#获取每行的平均值
means=[导入数据中的行的row.means()]
#计算平方误差
平方误差=[(行平均值)**2行,zip平均值(导入数据,平均值)]
#计算“每行平方误差的平均值”(又名方差)
方差=[row.mean()表示平方误差中的行]
#健康检查
打印(差异)
打印(导入数据.var(1))
# [0.6666666666666666, 0.6666666666666666, 0.6666666666666666]
# [0.66666667 0.66666667 0.66666667]

换一种方式:为什么不让你的同事做一系列已知方差(可能是平均值)的测试(例如,一堆行),并证明你的答案是正确的?一些极端情况(甚至可能包括无穷大和NaN),以及一些使用更常见数据的测试应该可以解决这个问题。想想看:
np.var
已经被成千上万的人成功地使用了。
axis
参数可能是一个问题(
axis=0
axis=1
),但是输出的维度(假设您的输入不是方形数组)应该已经验证了轴的选择。@00,感谢您的关注。是的,我当然同意,没有理由怀疑np.var是否有效。我通常会向同事指出这一点。不过,手工计算还有另一个好处。第二个术语(我的问题中“2”部分下面的第三行)与第一个术语相比,应该显示某些行为,因此检查一下它会很有用。对不起,这里的第二个和第一个术语是什么?你指的是一行代码;在数学意义上,这对我来说并不是一个真正的“术语”。为了实现这一点,有一种更奇特的方法:将数组转换为熊猫数据帧,计算方差和任何其他术语,跨越列,并将结果存储在新的列中。您甚至可以使用相关的时间戳为数据帧行编制索引。哇,谢谢。我花了一段时间才弄明白你在这里干了什么。很有教育意义。我很感激知道如何使用“row”。很高兴我能帮上忙:)我想我在这里做的最“神奇”的事情是
(row mean)**2
部分,因为
row
实际上是一个numpy数组,而
mean
只是一个浮点数。
平均值
分布在
上,然后
**2
对结果进行元素化处理。这种行为是由
np.ndarray
类型的实现方式引起的,这种行为称为广播。我建议你读一读它,因为它是难以置信的强大!很高兴看到您尝试直接使用
numpy
,这比使用纯Python做事情快得多:)
for row in importedData:
    mean_test = np.mean(importedData,axis=1)
print(mean_test)
Traceback (most recent call last):
  File "<string>", line 13, in <module>
TypeError: list indices must be integers or slices, not tuple
 n = len(importedData[0,:])         # Trying to get the length of each row.
 mean = mean(importedData[0,:])     # Likewise trying to get the mean of each row.
 deviations = [(x - mean) ** 2 for x in importedData]
 variance = sum(deviations) / n