我想初始化并填充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()
?我错过了一个更好的选择吗?
答案 0 :(得分:39)
您也可以尝试:
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 +
答案 1 :(得分:27)
答案 2 :(得分:3)
我觉得这很容易记住:
numpy.array([numpy.nan]*3)
出于好奇,我计时了,@JoshAdel's answer和@shx2's 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
答案 3 :(得分:1)
仅供将来参考,乘以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)
答案 4 :(得分:0)
如果您不介意None
,可以使用:
a = np.empty(3, dtype=object)