根据列值和变量合成numpy数组/矩阵?
我正在玩 NumPy
和 Scipy
,但在文档中找不到某个功能,所以想请教一下大家。
假设我有一个 NumPy
的数组,这个数组有两列和 k
行。第一列是一个数字指标(比如 2 = 男性
,1 = 女性
,0 = 未知
),而第二列可能是一些值或分数的 list
。
我想要找出所有指标为 0 的行的标准差(也可以是平均值或其他,我只是想应用一个函数),然后是指标为 1 的行,最后是指标为 2 的行。
有没有现成的函数可以帮我完成这个?
在 R
语言中,可以在 plyr
包里找到类似的功能。那 NumPy
和/或 Scipy
有类似的功能吗?还是说我得自己创建一个掩码,然后通过这个掩码来过滤数组,再应用我的函数?
一如既往,感谢大家的帮助!
2 个回答
2
你可以使用被遮罩的数组操作来实现这个功能。
要创建遮罩,你可以用numpy的where函数,像这样:
male_mask = numpy.where(a[:,0]==2, False, True)
female_mask = numpy.where(a[:,0]==1, False, True)
然后,记得使用numpy.ma中的特殊函数:
http://docs.scipy.org/doc/numpy/reference/routines.ma.htmlmale_average = numpy.ma.average(ma.array(a[:,1], mask=male_mask))
补充说明:其实,这样做也可以:
numpy.ma.average(ma.array(a[:,1], mask=a[:,0]!=value))
4
如果我理解你的描述,你有一个数据集,大概是这样的:
In [79]: x=np.random.randint(0,3,size=100)
In [80]: y=np.random.randint(0,100,size=100)
In [81]: d=np.vstack([x,y]).T
In [88]: print d[:5,:]
[[ 0 43]
[ 1 60]
[ 2 60]
[ 1 4]
[ 0 30]]
在这种情况下,可以使用 numpy.unique
来生成一个唯一的“键”值数组:
In [82]: idx=np.unique(d[:,0])
In [83]: print idx
[0 1 2]
然后这些值可以用来驱动一个生成器表达式,像这样:
[113]: g=(d[np.where(d[:,0]==val),1].std() for val in idx)
这个生成器 g
会输出所有在 d
中与索引每个条目匹配的条目的标准差。接着可以使用 numpy.fromiterator
来收集结果:
In [114]: print np.vstack([idx,np.fromiter(g,dtype=np.float)]).T
[[ 0. 26.87376385]
[ 1. 29.41046084]
[ 2. 24.2477246 ]]
注意,在最后一步堆叠时,键会被转换为浮点数,这可能不适合你的数据,但我这样做是为了让最终结果看起来“好看”,方便展示。