Создать пустую матрицу, заполненную NaN


195

У меня есть следующий код:

r = numpy.zeros(shape = (width, height, 9))

Создает width x height x 9матрицу, заполненную нулями. Вместо этого я хотел бы знать, есть ли функция или способ инициализировать их, вместо того, чтобы NaNиспользовать простой способ.


2
Одно предостережение в том, что NumPy не имеет целочисленного значения NA (в отличие от R). Смотрите список панд Готча . Следовательно np.nanидет не так, когда преобразуется в Int.
smci

smci правильно. Для NumPy такого значения NaN нет. Так что это зависит от типа и от NumPy, какое значение будет там для NaN. Если вы не знаете об этом, это вызовет проблемы
MasterControlProgram

Ответы:


271

Вам редко нужны циклы для векторных операций в numpy. Вы можете создать неинициализированный массив и назначить все записи сразу:

>>> a = numpy.empty((3,3,))
>>> a[:] = numpy.nan
>>> a
array([[ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN]])

Я рассчитал альтернативы a[:] = numpy.nanздесь и a.fill(numpy.nan)как отправлено Blaenk:

$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)"
10000 loops, best of 3: 54.3 usec per loop
$ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a[:] = np.nan" 
10000 loops, best of 3: 88.8 usec per loop

Сроки показывают предпочтение в ndarray.fill(..)качестве более быстрой альтернативы. OTOH, мне нравится удобная реализация numpy, когда вы можете назначать значения целым слайсам в то время, намерение кода очень ясно.

Обратите внимание, что ndarray.fillвыполняет свою операцию на месте, поэтому numpy.empty((3,3,)).fill(numpy.nan)вместо этого вернется None.


8
Я согласен, что намерение вашего кода яснее. Но спасибо за непредвзятые сроки (или, скорее, тот факт, что вы все еще опубликовали их), я ценю это :)
Хорхе Исраэль Пенья

2
Мне нравится этот a = numpy.empty((3, 3,)) * numpy.nan. Он рассчитан быстрее, fillно медленнее, чем метод присваивания, но это единственная возможность !!
heltonbiker

2
Пожалуйста, посмотрите на этот ответ: stackoverflow.com/questions/10871220/…
Иван

3
Я предпочитаю .fill()метод, но разница в скоростях сводится практически к нулю, когда массивы становятся больше.
naught101

4
... потому что np.empty([2, 5])создает массив, затем fill()модифицирует этот массив на месте, но не возвращает копию или ссылку. Если вы хотите вызывать np.empty(2, 5)по имени («присваивать переменной»), вы должны сделать это, прежде чем выполнять операции с ней на месте. То же самое происходит, если вы делаете [1, 2, 3].insert(1, 4). Список создается и вставляется 4, но невозможно получить ссылку на список (и, таким образом, можно предположить, что он был собран мусором). Для неизменяемых данных, таких как строки, возвращается копия, потому что вы не можете работать на месте. Панды могут сделать оба.
flutefreak7
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.