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

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

有什么比以下更好:

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

我知道zerosones将v = 0,1的工作。我可以使用v * ones(n) ,但它不会工作时, vNone ,也会慢得多。

NumPy 1.8引入了np.full() ,这是一个比empty()更直接的方法,后面跟着fill()来创build一个具有特定值的数组:

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

这可以说是创build一个充满特定值的数组方式,因为它明确地描述了正在实现的内容(原则上它可以非常高效,因为它执行一个非常特定的任务)。

已更新为Numpy 1.7.0: (Hat-tip to @Rolf Bartstra。)

a=np.empty(n); a.fill(5) a=np.empty(n); a.fill(5)是最快的。

按降序排列:

 %timeit a=np.empty(1e4); a.fill(5) 100000 loops, best of 3: 5.85 us per loop %timeit a=np.empty(1e4); a[:]=5 100000 loops, best of 3: 7.15 us per loop %timeit a=np.ones(1e4)*5 10000 loops, best of 3: 22.9 us per loop %timeit a=np.repeat(5,(1e4)) 10000 loops, best of 3: 81.7 us per loop %timeit a=np.tile(5,[1e4]) 10000 loops, best of 3: 82.9 us per loop 

我相信fill是做到这一点的最快方法。

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

你也应该总是避免迭代,就像你在你的例子中所做的那样。 一个简单a[:] = v将完成你的迭代使用numpy 广播 。

显然,不仅绝对速度,而且速度顺序 (由用户1579844报告)是机器相关的; 这是我发现的:

a=np.empty(1e4); a.fill(5) a=np.empty(1e4); a.fill(5)最快;

按降序排列:

 timeit a=np.empty(1e4); a.fill(5) # 100000 loops, best of 3: 10.2 us per loop timeit a=np.empty(1e4); a[:]=5 # 100000 loops, best of 3: 16.9 us per loop timeit a=np.ones(1e4)*5 # 100000 loops, best of 3: 32.2 us per loop timeit a=np.tile(5,[1e4]) # 10000 loops, best of 3: 90.9 us per loop timeit a=np.repeat(5,(1e4)) # 10000 loops, best of 3: 98.3 us per loop timeit a=np.array([5]*int(1e4)) # 1000 loops, best of 3: 1.69 ms per loop (slowest BY FAR!) 

所以,试着找出,并使用你的平台上最快的。

你可以使用numpy.tile ,例如:

 v = 7 rows = 3 cols = 5 a = numpy.tile(v, (rows,cols)) a Out[1]: array([[7, 7, 7, 7, 7], [7, 7, 7, 7, 7], [7, 7, 7, 7, 7]]) 

虽然tile是为了“拼贴”一个数组(而不是像这样的标量),但是它将完成这个工作,创build任何大小和尺寸的预先填充的数组。

我有

 numpy.array(n * [value]) 

记住,但显然这比所有其他的build议足够大n

这里是与perfplot (我的一个宠物项目)的完整比较。

在这里输入图像说明

两个emptyselect仍然是最快的(NumPy 1.12.1)。 full赶上大arrays。


代码生成的情节:

 import numpy as np import perfplot def empty_fill(n): a = np.empty(n) a.fill(3.14) return a def empty_colon(n): a = np.empty(n) a[:] = 3.14 return a def ones_times(n): return 3.14 * np.ones(n) def repeat(n): return np.repeat(3.14, (n)) def tile(n): return np.repeat(3.14, [n]) def full(n): return np.full((n), 3.14) def list_to_array(n): return np.array(n * [3.14]) perfplot.show( setup=lambda n: n, kernels=[ empty_fill, empty_colon, ones_times, repeat, tile, full, list_to_array ], n_range=[2**k for k in range(23)], xlabel='len(a)', logx=True, logy=True, )