Как я могу, используя Numpy, вычислить, сколько записей в моем массиве дает суммарную сумму 0,9 в качестве примера? - PullRequest
1 голос
/ 12 февраля 2020

После предварительного формирования PCA у меня есть мой (масштабированный и объясненный пропорции) массив с суммой 1. Мне нужно много компонентов, чтобы получить хороший график - поэтому я хотел бы иметь возможность каким-то образом установить желаемую совокупную сумму и получить сколько компонентов массива мне нужно будет получить. В качестве примера [0, 1, 2, 3, 4, 5], и я хотел, чтобы накопленная сумма 6, я получил ответ, что мне нужно четыре записи.

Ответы [ 3 ]

3 голосов
/ 12 февраля 2020

Мое решение было бы использовать 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 для количества записей, так как функция вернет первый индекс, по которому завершено накопление, поэтому индекс 3 означает 4 записи.

1 голос
/ 12 февраля 2020

Предполагая, что 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
1 голос
/ 12 февраля 2020

Вы можете рассчитать совокупную сумму, а затем вычислить .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, так что в случае, если нет равенства, удовлетворяющего порогу, оно вернет количество элементов плюс один.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...