Лучший способ инициализировать и заполнить массив Numpy?

Я хочу инициализировать и заполнить 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() call возвращает правильный тип объекта, поэтому я не понимаю, почему .fill() не работает?

Присвоение результата np.empty() сначала работает нормально:

>>> a = np.empty(3)
>>> a.fill(np.nan)
>>> a
array([ nan,  nan,  nan])

Почему мне нужно присвоить переменную, чтобы использовать np.fill()? Я пропускаю лучшую альтернативу?

4 ответа

Решение

np.fill изменяет массив на месте и возвращает None, Поэтому, если вы присваиваете результат имени, он получает значение None,

Альтернативой является использование выражения, которое возвращает nan Например:

a = np.empty(3) * np.nan

Вы также можете попробовать:

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`.

Хотя я думаю, что это может быть доступно только в версии 1.8+

Я нахожу это легко запомнить:

numpy.array([numpy.nan]*3)

Из любопытства я рассчитал время, и ответ @JoshAdel и ответ @shx2 намного быстрее, чем мой с большими массивами.

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

Просто для дальнейшего использования, умножение на 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)

Если ты не против None, вы можете использовать:

a = np.empty(3, dtype=object)
Другие вопросы по тегам