[英]calculate mean using numpy ndarray
文本文件如下:
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>> 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 ??
mean
函數用於計算數字數組的平均值。 您需要通過將條件應用於c2
來選擇c3
的值。
什么可能更適合您的需求將數據分成層次結構,我更喜歡使用詞典。 就像是
data = {}
with open('data.txt') as f:
contents = csv.reader(f, delimiter=' ')
for (name, attribute, value) in contents:
data[name] = data.get(name, {}) # Default value is a new dict
attr_name, attr_year = attribute.split('_')
attr_year = int(attr_year)
data[name][attr_name] = data[name].get(attr_name, {})
data[name][attr_name][attr_year] = value
現在data
看起來像
{
"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])
在這里我仍然使用np.mean
,但只在普通的Python列表上調用它。
我會創建這個社區wiki,因為它更“我認為你應該這樣做”而不是“這就是你問的問題的答案”。 對於像這樣的東西,我可能會使用pandas
而不是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()
..而且,呃,就是這樣。
首先,將數據讀入DataFrame
,允許空格或_
分隔列:
>>> 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
然后按name
和property
分組,獲取value
列,並計算平均值:
>>> 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="[ _]"
技巧對於真正的代碼來說有點太可愛了,雖然它在這里工作得很好。 在實踐中,我使用空格分隔符,在第二列中讀取property_year
然后執行
df["property"], df["year"] = zip(*df["property_year"].str.split("_"))
del df["property_year"]
允許其他列中的下划線。
您可以直接在numpy數組中讀取數據:
data = np.recfromcsv("data.txt", delimiter=" ", names=['name', 'type', 'value'])
那么你可以用np.where找到合適的索引:
indices = np.where((data.name == 'david') * data.type.startswith('height'))
並在thoses指數上執行均值:
np.mean(data.value[indices])
如果您的數據始終采用提供的格式。 然后你可以使用數組切片來做到這一點:
(data[:-1:2] + data[1::2]) / 2
結果是:
[ 55. 155. 87.5 165. ]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.