NumPy数组初始化(填充相同值)

395 投票
9 回答
688519 浏览
提问于 2025-04-16 17:01

我需要创建一个长度为 n 的 NumPy 数组,数组里的每个元素都要是 v

有没有比下面这个更好的方法:

a = empty(n)
for i in range(n):
    a[i] = v

我知道如果 v 是 0 或 1,可以用 zerosones 来实现。我也可以用 v * ones(n),但是当 vNone 的时候就不行,而且速度也会慢很多。

9 个回答

76

我认为fill是最快的方法来实现这个功能。

a = np.empty(10)
a.fill(7)

你也应该尽量避免像你示例中那样进行循环。简单地使用a[:] = v就能通过numpy的广播功能完成你循环的工作。

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]])

可以说,这就是创建一个填满特定值的数组的最佳方式,因为它清楚地说明了我们想要实现的目标(而且从理论上讲,这个方法可以非常高效,因为它只执行一个特定的任务)。

撰写回答