如何从与其中一个数组的零元素对应的ndarray集合中删除列?

时间:2011-04-15 08:07:05

标签: python numpy

我在3个带有形状的数组中有一些数据:

docLengths.shape = (10000,)
docIds.shape = (10000,)
docCounts.shape = (68,10000)

我想获得某些i的相对计数及其平均值和标准差:

docRelCounts = docCounts/docLengths
relCountMeans = docRelCounts[i,:].mean()
relCountDeviations = docRelCounts[i,:].std()

问题是,docLengths的一些元素是零。这会在docRelCounts中生成NaN元素,因此平均值和偏差也是NaN。

我需要删除零长度文档的数据。我可以写一个循环,找到零长度的文档并删除它们,但我希望有一些numpy数组魔法可以更有效地执行此操作。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

docRelCounts = docCounts/docLengths

goodDocRelCounts = docRelCounts[i,:][np.invert(np.isnan(docRelCounts[i,:]))]
relCountMeans = goodDocRelCounts.mean()
relCountDeviations = goodDocRelCounts.std()

np.isnan返回与True相同形状的数组,其中原始数组为NaN,其他地方为False。并且np.invert反转了这一点,然后只有非goodDocRelCounts的值才会得到NaN

答案 1 :(得分:0)

使用来自scipy.stats的nanmean和nanstd:

from scipy.stats import nanmean, nanstd

答案 2 :(得分:0)

最后我做到了这一点(在我看到eumiro的答案之前我实际上已经解决了 - 它有点简单,但不是更好,只是不同,所以我想我会把它包括在内)。

goodData = docLengths!=0  # find zero elements
docLen = docLen[goodData]
docCounts = docCounts[:,goodData]

docRelCounts = docCounts/docLen
means = map(lambda x:x.mean(), docRelCounts)
stds = map(lambda x:x.std(), docRelCounts)