在形成 PCA 后,我有我的(重新缩放和方差比例解释(数组,总和为 1。 我必须使用许多组件才能获得良好的爬行图 - 因此我希望能够以某种方式设置所需的累积总和,并获得我需要多少数组组件才能获得它。 举个例子[0, 1, 2, 3, 4, 5]
我想要 6 的累积总和,我会得到我需要四个条目的答案。
我的解决方案是将numpy.cumsum
与numpy.where
一起使用:
arr = np.arange(6) # dummy data
max_cum = 6 # your stop certerion
arr_cum = arr.cumsum() # calculate cumulative sums of your array
num = np.where(arr_cum >= max_cum) # get indices where arr_cum passes your max_cum
>> In: num[0][0]
>> Out:
3
num
包含所有包含等于或高于止损条件的值的索引,因此您需要获取第一个(numpy.where
返回一个 2D 数组,因此您需要[0][0]
(。
单行功能:
def lowest_cum(arr, max_cum):
return np.where(arr.cumsum() >= max_cum)[0][0]
>> In: lowest_cum(arr=np.arange(6), max_cum=6)
>> Out:
3
编辑:不用说,条目数需要 +1,因为该函数将返回完成 cumsum 的第一个索引,因此索引 3 表示 4 个条目。
您可以计算累计总和,然后计算大于或等于阈值的.argmax(..)
:
>>> np.argmax(np.hstack((a.cumsum() >= 6, True))) + 1
4
由于a.cumsum()
是累计总和,因此:
>>> a.cumsum()
array([ 0, 1, 3, 6, 10, 15])
因此,我们计算满足阈值的第一个索引:
>>> a.cumsum() >= 6
array([False, False, False, True, True, True])
我们附加一个True
,这样如果没有满足阈值的等值,它将返回元素数加一。
假设a
已经排序,只需计算尚未超过阈值的条目数,并添加最终超过阈值的条目。
a = np.arange(6)
num = (a.cumsum() < 6).sum() + 1 # 4
作为一个函数:
def cum_thresh(a, thresh):
"""
the sequence a has to be sorted
"""
return (np.cumsum(a) < thresh).sum() + 1