Как определить, имеет ли данный 2D-массив пустые столбцы в Python? - PullRequest
0 голосов
/ 30 апреля 2019

1 Задача

Я занимаюсь 100 Упражнениями для Numpy . Вопрос 60 спрашивает, как определить, имеет ли данный 2D-массив нулевые столбцы?

Мне интересно, просит ли он проверить столбец, заполненный 0 или наполненный nan?

2 решения, которые я нашел

Если пустые столбцы означают столбец с его значением, равным 0, этот ответ удовлетворяет.

# Author: Warren Weckesser
Z = np.random.randint(0,3,(3,10))
print((~Z.any(axis=0)).any())

Используется трюк any(). Обратите внимание, что если одно из значений в массиве не равно 0, np.array().any() вернет True. Например:

np.array([0,-1,0]).any()
[Out]: True

Однако, если пустые столбцы означают столбец со значением, равным nan, мой ответ удовлетворяет.

Z = np.random.randint(0,3,(3,10)).astype(float)
Z[:,0] = np.nan
G = np.isnan(Z)
print((G.all(axis=0)).any())

3 Резюме

Что означает null в python? Я думаю, что это означает nan, но это противоречит ответу Автора (Уоррена Векессера).

1 Ответ

0 голосов
/ 30 апреля 2019

NaN или nan, в любом случае, равно нулю. Это означает, что там нет данных.

Согласно этому посту ,

Основная причина использования NaN (больше None) заключается в том, что он может храниться с dumpy float64 dtype, а не с менее эффективным dtype

.

Как видите, None, np.nan и 0 ведут себя немного по-разному.

print(any(np.array([1, None]))) # True
print(all(np.array([1, None]))) # False

print(any(np.array([1, np.nan]))) # True
print(all(np.array([1, np.nan]))) # True

print(any(np.array([1, 0]))) # True
print(all(np.array([1, 0]))) # False

Мы видим, что np.nan по некоторым причинам всегда оценивается в True.

Согласно этой записи , и Python, и Numpy оценивают нулевые значения как True.

Так что, если в примере было действительно нулевое значение, оно было бы оценено как истинное. Я думаю, что целью упражнения было показать использование функции any() и отрицание с помощью ~. Я согласен, название немного сбито с толку, и он на самом деле пытается найти False значений, а не нулевые. Это также может быть реализовано в том, что np.random.randint(0,3,(3,10)) будет только когда-либо возвращать массив, заполненный значениями 0, 1 или 2 и никогда False или np.nan.

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