根据列值和变量复合一个numpy数组/矩阵?

时间:2011-08-31 05:23:13

标签: python numpy scipy

我正在玩NumPyScipy而我在文档中找不到功能。因此,我想知道是否有人可以提供帮助。

假设我在NumPy中有一个包含两列和k行的数组。一列用作数字指标(例如2 = male1 = female0 = unknown),而第二列可能是list值或分数。

让我们说我想找到指标0的所有行的值的标准差(可能是平均值或者其他,我只想应用函数),然后是1,最后是2.

是否有预定义的功能可以为我合成这个?

R中,等效内容可以在plyr包中找到。 NumPy和/或Scipy是否具有等价物,或者我是否坚持为此数组创建一个掩码,然后以某种方式过滤此掩码然后应用我的函数?

一如既往,感谢您的帮助!

2 个答案:

答案 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))