我在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数组魔法可以更有效地执行此操作。有什么想法吗?
答案 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)