初始化和填充numpy数组的最佳方法?[副本]

l3zydbqr  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(116)

此问题已在此处有答案

Create numpy matrix filled with NaNs(11个回答)
After x = x.y(), why did x become None instead of being modified (possibly causing "AttributeError: 'NoneType' object has no attribute")?(1个答案)
28天前关闭
我想初始化并填充一个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()?我错过了一个更好的选择吗?

xuo3flqw

xuo3flqw1#

您也可以尝试:

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+中可用

z4bn682m

z4bn682m2#

np.fill就地修改数组,并返回None。因此,如果你将结果赋给一个名字,它会得到一个值None
另一种方法是使用返回nan的表达式,例如:

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

lskq00tm3#

我发现这很容易记住:

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
mwg9r5ms

mwg9r5ms4#

仅供将来参考,乘以np.nan仅适用于np.nan的数学性质。对于一个通用值N,需要使用np.ones() * N来模拟可接受的答案,然而,从速度方面来看,这不是一个非常好的选择。
最好的选择应该是np.full(),如果你不能使用,np.zeros() + N似乎比np.ones() * N更好,而np.empty() + Nnp.empty() * N根本不适合。请注意,当Nnp.nan时,np.zeros() + N也可以工作。

%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)
e4eetjau

e4eetjau5#

如果你不介意None,你可以用途:

a = np.empty(3, dtype=object)

相关问题