我需要创建一个长度为n
的NumPy数组,其中每个元素都是v
。
还有什么比:
更好a = empty(n)
for i in range(n):
a[i] = v
我知道zeros
和ones
适用于v = 0,1。我可以使用v * ones(n)
,但当v
为None
时,将不起作用<{1}},以及会慢得多。
答案 0 :(得分:237)
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]])
这可以说是创建一个充满某些值的数组的 方式,因为它明确地描述了正在实现的内容(原则上它可以非常有效,因为它执行非常特定的任务)。
答案 1 :(得分:84)
更新为Numpy 1.7.0:(帽子提示给@Rolf Bartstra。)
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
答案 2 :(得分:59)
我相信fill
是最快的方法。
a = np.empty(10)
a.fill(7)
你也应该总是避免像你在你的例子中那样进行迭代。一个简单的a[:] = v
将使用numpy broadcasting完成迭代所做的事情。
答案 3 :(得分:13)
显然,不仅绝对速度而且速度订单(由用户1579844报告)取决于机器;这是我发现的:
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!)
因此,请尝试找出并使用您平台上最快的内容。
答案 4 :(得分:9)
我有
numpy.array(n * [value])
记住,但显然这比其他足够大n
的其他建议要慢。
这里与perfplot(我的宠物项目)完全比较。
两个empty
替代品仍然是最快的(使用NumPy 1.12.1)。 full
赶上大阵列。
生成情节的代码:
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(27)],
xlabel='len(a)',
logx=True,
logy=True,
)
答案 5 :(得分:6)
您可以使用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
意味着“平铺”一个数组(而不是标量,如本例所示),但它可以完成任务,创建任意大小和维度的预填充数组。
答案 6 :(得分:1)
没有numpy
>>>[2]*3
[2, 2, 2]