Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用numpy ndarray计算平均值_Python_Python 2.7_Python 3.x_Numpy - Fatal编程技术网

Python 使用numpy ndarray计算平均值

Python 使用numpy ndarray计算平均值,python,python-2.7,python-3.x,numpy,Python,Python 2.7,Python 3.x,Numpy,文本文件如下所示: david weight_2005 50 david weight_2012 60 david height_2005 150 david height_2012 160 mark weight_2005 90 mark weight_2012 85 mark height_2005 160 mark height_2012 170 如何计算david和mark的体重和身高平均值,如下所示: david>> mean(weight_2005 and weight

文本文件如下所示:

david weight_2005 50
david weight_2012 60
david height_2005 150
david height_2012 160
mark weight_2005 90
mark weight_2012 85
mark height_2005 160
mark height_2012 170
如何计算david和mark的体重和身高平均值,如下所示:

david>> mean(weight_2005 and weight_2012), mean (height_2005 and height_2012)
mark>> mean(weight_2005 and weight_2012), mean (height_2005 and height_2012)
我的不完整代码是:

 import numpy as np
 import csv
 with open ('data.txt','r') as infile:
   contents = csv.reader(infile, delimiter=' ')
   c1,c2,c3 = zip(*contents)
   data = np.array(c3,dtype=float)

那么如何应用np.mean???

函数是用来计算一组数字的平均值的。您需要找到一种方法,通过对
c2
应用条件来选择
c3
的值

可能更适合您的需要的是将数据拆分为层次结构,我更喜欢使用字典。差不多

data={}
将open('data.txt')作为f:
contents=csv.reader(f,分隔符=“”)
对于内容中的(名称、属性、值):
data[name]=data.get(name,{})#默认值是一个新的dict
属性名称,属性年份=属性。拆分(“”)
属性年=整数(属性年)
数据[name][attr_name]=数据[name].get(attr_name,{})
数据[名称][属性名称][属性年份]=值
现在,
数据
将如下所示

{
    "david": {
        "weight": {
            2005: 50,
            2012: 60
        },
        "height": {
            2005: 150,
            2012: 160
        }
    },
    "mark": {
        "weight": {
            2005, 90,
            2012, 85
        },
        "height": {
            2005: 160,
            2012: 170
        }
    }
}
那么你能做的就是

david_avg_weight = np.mean(data['david']['weight'].values())
mark_avg_height = np.mean([v for k, v in data['mark']['height'].iteritems() if 2008 < k])
david_avg_weight=np.mean(数据['david']['weight'].values())
mark_avg_height=np.平均值([v代表k,数据中的v['mark']['height'].iteritems(),如果2008年

这里我仍然使用
np.mean
,但仅在普通Python列表中调用它。

如果您的数据始终采用提供的格式。然后,您可以使用阵列切片来执行此操作:

(data[:-1:2] + data[1::2]) / 2
结果:

[  55.   155.    87.5  165. ]

您可以通过以下方式直接读取numpy阵列中的数据:

data = np.recfromcsv("data.txt", delimiter=" ", names=['name', 'type', 'value']) data=np.recfromcsv(“data.txt”,delimiter=”“,names=['name','type','value'])) 然后,您可以使用np找到合适的索引,其中:

indices = np.where((data.name == 'david') * data.type.startswith('height')) index=np.where((data.name='david')*data.type.startswith('height')) 并对这些指数进行平均值计算:

np.mean(data.value[indices]) np.平均值(数据值[指数])
我将创建这个社区wiki,因为它更像是“我认为你应该这样做”,而不是“这是你所问问题的答案”。对于类似的东西,我可能会使用它而不是
numpy
,因为它的分组工具要好得多。与基于
numpy
的方法进行比较也很有用

import pandas as pd
df = pd.read_csv("data.txt", sep="[ _]", header=None, 
                 names=["name", "property", "year", "value"])
means = df.groupby(["name", "property"])["value"].mean()
。。而且,呃,就是这样


首先,将数据读入
数据框
,让空格或
分隔列:

>>> import pandas as pd
>>> df = pd.read_csv("data.txt", sep="[ _]", header=None, 
                 names=["name", "property", "year", "value"])
>>> df
    name property  year  value
0  david   weight  2005     50
1  david   weight  2012     60
2  david   height  2005    150
3  david   height  2012    160
4   mark   weight  2005     90
5   mark   weight  2012     85
6   mark   height  2005    160
7   mark   height  2012    170
然后按
名称
属性
分组,取
列,计算平均值:

>>> means = df.groupby(["name", "property"])["value"].mean()
>>> means
name   property
david  height      155.0
       weight       55.0
mark   height      165.0
       weight       87.5
Name: value, dtype: float64

。。好的,
sep=“[\u]”
技巧对于真正的代码来说有点太可爱了,尽管它在这里工作得很好。实际上,我会使用空格分隔符,在第二列中读作
property\u year
,然后执行

df["property"], df["year"] = zip(*df["property_year"].str.split("_"))
del df["property_year"]

允许在其他列中使用下划线。

感谢您的努力,向上投票!但我正在寻找更简短的方法,主要是使用numpy@bheklilr@nilsNumPy不会让代码变得更短。即使在您的示例中,您的代码也在解析文件。我的只是将文件解析成一个更有用的数据结构,然后可以将NumPy函数应用于它。NumPy所需要的只是计算平均值,但由于您希望能够根据条件进行计算,因此需要将数据转换为更易于操作的形式。Pandas可能是一个很好的库,可以为您这样做,但我个人不明白为什么9行代码太长。如果您能解释代码@Nicolas Barbey中*的含义,那就更好了有一个类型错误:startswith first arg必须是字节或字节元组,而不是numpy.str\ux。如何更正?@Nicolas Barbey*只是布尔数组的乘法。我不理解类型错误。我在python 2.7.3上进行了测试。你的python版本是什么?我正在使用python 3.2和numpy 1.8@Nicolas Barbey