我正在玩NumPy
和Scipy
而我在文档中找不到功能。因此,我想知道是否有人可以提供帮助。
假设我在NumPy
中有一个包含两列和k
行的数组。一列用作数字指标(例如2 = male
,1 = female
,0 = unknown
),而第二列可能是list
值或分数。
让我们说我想找到指标0的所有行的值的标准差(可能是平均值或者其他,我只想应用函数),然后是1,最后是2.
是否有预定义的功能可以为我合成这个?
在R
中,等效内容可以在plyr
包中找到。 NumPy
和/或Scipy
是否具有等价物,或者我是否坚持为此数组创建一个掩码,然后以某种方式过滤此掩码然后应用我的函数?
一如既往,感谢您的帮助!
答案 0 :(得分: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 ]]
请注意,在堆叠过程中,在最后一步中将键转换为浮点,您可能不希望这取决于您的数据,但我只是为了说明目的而做了一个“好看”的最终结果发布。
答案 1 :(得分:2)
您可以使用屏蔽数组操作。 http://docs.scipy.org/doc/numpy/reference/maskedarray.html#maskedarray
要创建掩码,可以使用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.html
male_average = numpy.ma.average(ma.array(a[:,1], mask=male_mask))
编辑:实际上,这也适用:
numpy.ma.average(ma.array(a[:,1], mask=a[:,0]!=value))