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

问题描述 投票:0回答:5

我想初始化并填充一个

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()
?我错过了更好的选择吗?

python arrays numpy multidimensional-array initialization
5个回答
43
投票

您也可以尝试:

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


31
投票

np.fill
就地修改数组,并返回
None
。因此,如果您将结果分配给名称,它将获得值
None

另一种方法是使用返回

nan
的表达式,例如:

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

3
投票

我发现这很容易记住:

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

2
投票

仅供将来参考,乘以

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)

0
投票

如果你不介意

None
,你可以使用:

a = np.empty(3, dtype=object)
© www.soinside.com 2019 - 2024. All rights reserved.