Я хочу инициализировать и заполнить массив numpy
. Каков наилучший способ?
Это работает так, как я ожидаю:
>>> import numpy as np
>>> np.empty(3)
array([ -1.28822975e-231, -1.73060252e-077, 2.23946712e-314])
Но это не так:
>>> np.empty(3).fill(np.nan)
>>>
Ничего?
>>> type(np.empty(3))
<type 'numpy.ndarray'>
Мне кажется, что вызов np.empty()
возвращает правильный тип объекта, поэтому я не понимаю, почему .fill()
не работает?
Назначение результата np.empty()
сначала отлично работает:
>>> a = np.empty(3)
>>> a.fill(np.nan)
>>> a
array([ nan, nan, nan])
Почему мне нужно назначить переменную, чтобы использовать np.fill()
? Не хватает ли лучшей альтернативы?
Ответ 1
np.fill
изменяет массив на месте и возвращает None
. Поэтому, если вы присваиваете результат имени, оно получает значение None
.
Альтернативой является использование выражения, которое возвращает nan
, например:
a = np.empty(3) * np.nan
Ответ 2
Вы также можете попробовать:
In [79]: np.full(3, np.nan)
Out[79]: array([ nan, nan, nan])
Соответствующий документ:
Definition: np.full(shape, fill_value, dtype=None, order='C')
Docstring:
Return a new array of given shape and type, filled with `fill_value`.
Хотя я думаю, что это может быть доступно только в numpy 1.8 +
Ответ 3
Мне это легко запомнить:
numpy.array([numpy.nan]*3)
Из любопытства я приурочил его, и @JoshAdel answer и @shx2 answer далеки быстрее, чем мой с большими массивами.
In [34]: %timeit -n10000 numpy.array([numpy.nan]*10000)
10000 loops, best of 3: 273 µs per loop
In [35]: %timeit -n10000 numpy.empty(10000)* numpy.nan
10000 loops, best of 3: 6.5 µs per loop
In [36]: %timeit -n10000 numpy.full(10000, numpy.nan)
10000 loops, best of 3: 5.42 µs per loop
Ответ 4
Просто для справки в будущем, умножение на np.nan
работает только из-за математических свойств np.nan
.
Для общего значения N
нужно использовать np.ones() * N
, подражая принятому ответу, однако, по скорости, это не очень хороший выбор.
Лучший выбор был бы np.full()
, как уже указывалось, и, если это не доступно для вас, np.zeros() + N
кажется лучшим выбором, чем np.ones() * N
, тогда как np.empty() + N
или np.empty() * N
просто не подходящее. Обратите внимание, что np.zeros() + N
также будет работать, если N
np.nan
.
%timeit x = np.full((1000, 1000, 10), 432.4)
8.19 ms ± 97.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit x = np.zeros((1000, 1000, 10)) + 432.4
9.86 ms ± 55.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit x = np.ones((1000, 1000, 10)) * 432.4
17.3 ms ± 104 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%timeit x = np.array([432.4] * (1000 * 1000 * 10)).reshape((1000, 1000, 10))
316 ms ± 37.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)