NumPy数组初始化(填充相同值)
我需要创建一个长度为 n
的 NumPy 数组,数组里的每个元素都要是 v
。
有没有比下面这个更好的方法:
a = empty(n)
for i in range(n):
a[i] = v
我知道如果 v
是 0 或 1,可以用 zeros
和 ones
来实现。我也可以用 v * ones(n)
,但是当 v
是 None
的时候就不行,而且速度也会慢很多。
9 个回答
118
更新于 Numpy 1.7.0:(感谢 @Rolf Bartstra 的提醒。)
a=np.empty(n); a.fill(5)
是最快的方式。
按照速度从快到慢排列:
%timeit a=np.empty(10000); a.fill(5)
100000 loops, best of 3: 5.85 us per loop
%timeit a=np.empty(10000); a[:]=5
100000 loops, best of 3: 7.15 us per loop
%timeit a=np.ones(10000)*5
10000 loops, best of 3: 22.9 us per loop
%timeit a=np.repeat(5,(10000))
10000 loops, best of 3: 81.7 us per loop
%timeit a=np.tile(5,[10000])
10000 loops, best of 3: 82.9 us per loop
547
NumPy 1.8 版本引入了 np.full()
这个方法。这个方法比先用 empty()
创建一个空数组再用 fill()
填充要简单直接得多,适合用来创建一个填满特定值的数组:
>>> np.full((3, 5), 7)
array([[ 7., 7., 7., 7., 7.],
[ 7., 7., 7., 7., 7.],
[ 7., 7., 7., 7., 7.]])
>>> np.full((3, 5), 7, dtype=int)
array([[7, 7, 7, 7, 7],
[7, 7, 7, 7, 7],
[7, 7, 7, 7, 7]])
可以说,这就是创建一个填满特定值的数组的最佳方式,因为它清楚地说明了我们想要实现的目标(而且从理论上讲,这个方法可以非常高效,因为它只执行一个特定的任务)。