我需要创建一个长度为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时行不通,也会慢得多。
当前回答
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
>>>[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]])
这可以说是创建一个充满特定值的数组的方法,因为它显式地描述了要实现的内容(原则上它可以非常有效,因为它执行非常特定的任务)。
显然,不仅绝对速度,而且速度顺序(如user1579844所报告的)都与机器有关;以下是我的发现:
一个= np.empty (1 e4);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!)
所以,试着找出答案,并使用你平台上最快的方法。
我有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,
)
我们也可以写成
v=7
n=5
a=np.linspace(v,v,n)