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

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

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

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

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

Хотя я думаю, что это может быть доступно только в numpy 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)