根据列值和变量合成numpy数组/矩阵?

1 投票
2 回答
1848 浏览
提问于 2025-04-17 00:50

我正在玩 NumPyScipy,但在文档中找不到某个功能,所以想请教一下大家。

假设我有一个 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.html

male_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 ]]

注意,在最后一步堆叠时,键会被转换为浮点数,这可能不适合你的数据,但我这样做是为了让最终结果看起来“好看”,方便展示。

撰写回答