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

还有什么比:

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

我知道0和1适用于v = 0,1。我可以用v * ones(n),但当v为None时行不通,也会慢得多。


当前回答

您可以使用numpy。瓷砖,例如:

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是为了“平铺”一个数组(而不是在这种情况下的标量),它将完成工作,创建任何大小和维度的预填充数组。

其他回答

你也可以使用np.broadcast_to。

要创建一个形状(维度)为s,值为v的数组,你可以这样做(在你的例子中,数组是1-D,并且s = (n,)):

a = np.broadcast_to(v, s).copy()

如果a只需要是只读的,你可以使用以下方法(这是更有效的方式):

a = np.broadcast_to(v, s)

这样做的好处是v可以被赋值为单个数字,但如果需要不同的值,也可以赋值为数组(只要v.shape匹配s的尾部)。

额外的好处:如果你想强制创建的数组的dtype:

a = np.broadcast_to(np.asarray(v, dtype), s).copy()

为Numpy 1.7.0更新:(向@Rolf Bartstra致敬。)

一个= 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

没有numpy

>>>[2]*3
[2, 2, 2]

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

这可以说是创建一个充满特定值的数组的方法,因为它显式地描述了要实现的内容(原则上它可以非常有效,因为它执行非常特定的任务)。

您可以使用numpy。瓷砖,例如:

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是为了“平铺”一个数组(而不是在这种情况下的标量),它将完成工作,创建任何大小和维度的预填充数组。