我需要创建一个长度为n的NumPy数组,其中每个元素都是v。
还有什么比:
a = empty(n)
for i in range(n):
a[i] = v
我知道0和1适用于v = 0,1。我可以用v * ones(n),但当v为None时行不通,也会慢得多。
我需要创建一个长度为n的NumPy数组,其中每个元素都是v。
还有什么比:
a = empty(n)
for i in range(n):
a[i] = v
我知道0和1适用于v = 0,1。我可以用v * ones(n),但当v为None时行不通,也会慢得多。
当前回答
我有np。数组(n * [value]),但显然,对于足够大的n,这比所有其他建议都要慢。就可读性和速度而言,最好的是
np.full(n, 3.14)
这里是与perfplot(我的一个宠物项目)的完整比较。
两个空的替代品仍然是最快的(NumPy 1.12.1)。完全赶上大数组。
代码生成的情节:
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,
)
其他回答
你也可以使用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()
我相信填充是最快的方法。
a = np.empty(10)
a.fill(7)
您还应该始终避免像您在示例中所做的那样进行迭代。简单的A [:] = v将完成使用numpy广播所做的迭代。
我们也可以写成
v=7
n=5
a=np.linspace(v,v,n)
您可以使用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是为了“平铺”一个数组(而不是在这种情况下的标量),它将完成工作,创建任何大小和维度的预填充数组。
没有numpy
>>>[2]*3
[2, 2, 2]