Подсчет ненулевых ненулевых элементов в четырех массивах - PullRequest
0 голосов
/ 01 июля 2019

У меня есть четыре массива, каждый из которых содержит нули и NaN с, и я пытаюсь получить общее количество всех элементов, которые являются ненулевыми и не NaN во всех массивах.MWE:

import numpy as np

np.random.seed(100)
array = np.random.rand(10,5)

array[0][0] = np.nan
array[1][0] = np.nan
array[0][3] = np.nan
array[5][2] = 0
array[5][4] = np.nan

Если я наберу

np.count_nonzero(np.logical_and(~np.isnan(array[1]), ~np.isnan(array[2]), ~np.isnan(array[3])))

, я получу вывод 4, как и ожидалось.Но добавление еще одного условия, например

np.count_nonzero(np.logical_and(~np.isnan(array[1]), ~np.isnan(array[2]), ~np.isnan(array[3]), ~np.isnan(array[9])))

, дает мне

Traceback (most recent call last):

  File "<ipython-input-36-02311cb3ca54>", line 1, in <module>
    np.count_nonzero(np.logical_and(~np.isnan(array[1]), ~np.isnan(array[2]), ~np.isnan(array[3]), ~np.isnan(array[9])))

ValueError: invalid number of arguments

Почему я получаю ошибку, добавив еще одно условие?

Ответы [ 2 ]

0 голосов
/ 01 июля 2019

Я думаю, что ответ заключается в том, что вы используете count_nonzero неправильно.

Из документов требуется только 2 параметра: numpy.count_nonzero(a, axis=None)[source] [numpy count_zero docs] [1]

Итакже вы не можете позвонить

Так почему бы не сделать что-то вроде этого:

import numpy as np

np.random.seed(100)
array = np.random.rand(10,5)

array[0][0] = np.nan
array[1][0] = np.nan
array[0][3] = np.nan
array[5][2] = 0
array[5][4] = np.nan

print(np.count_nonzero((array)) - np.sum(np.isnan(array)))

Итак, вы учитываете все non_zeros, которые включают в себя nan.Так что вычтите их.

Так сделайте это для каждого массива и добавьте их.

например

mySum = np.count_nonzero((array[1])) - np.sum(np.isnan(array[1]))
mySum += np.count_nonzero((array[2])) - np.sum(np.isnan(array[2])) 
mySum += np.count_nonzero((array[3])) - np.sum(np.isnan(array[3])) 
mySum += np.count_nonzero((array[9])) - np.sum(np.isnan(array[9]))

print(mySum)
0 голосов
/ 01 июля 2019

np.logical_and принимает только два массива и возвращает элемент и из двух массивов.И максимальное количество аргументов позиции, которое требуется, составляет 3, поэтому вы получаете ошибку, а она не делает то, что вы хотите;Лучший вариант - переписать свою логику следующим образом, и вы можете легко добавить больше строк в список индексов строк следующим образом:

(~np.isnan(array[[1,2,3,9]])).all(axis=0).sum()
# 4

или:

np.count_nonzero((~np.isnan(array[[1,2,3,9]])).all(axis=0))
# 4
...