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

max*_*max 205 python arrays numpy

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

还有什么比:

a = empty(n)
for i in range(n):
    a[i] = v
Run Code Online (Sandbox Code Playgroud)

我知道zerosones会的工作为V = 0,1,我可以使用v * ones(n),但是当它不会工作vNone,而且也将是慢得多.

Eri*_*got 265

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]])
Run Code Online (Sandbox Code Playgroud)

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

  • 对于 10,000 个元素,我观察到同样的事情(除了 `np.fill()` 不存在并且应该是 `arr.fill()`),大约有 10% 的差异。如果差异更大,我会在 NumPy 错误跟踪器中提出问题。:) 我更喜欢更明确和更清晰的代码,因为执行时间的差异如此之小,所以我一直使用 `np.full()`。 (2认同)

Yar*_*riv 88

更新为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
Run Code Online (Sandbox Code Playgroud)

  • 为更新的和直接的`np.full()`添加时间将是有用的.在我的机器上,使用NumPy 1.8.1,它比不那么直接的`fill()`版本慢了大约15%(这是意料之外的,因为`full()`有可能稍快一些). (13认同)
  • 注意:如果速度真的是一个问题,使用'10000`而不是`1e4`的大小会产生明显的差异,由于某种原因(`full()`慢了近50%,使用`1e4`). (2认同)

Pau*_*aul 63

我相信这fill是最快的方法.

a = np.empty(10)
a.fill(7)
Run Code Online (Sandbox Code Playgroud)

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


Rol*_*tra 16

显然,不仅绝对速度而且速度顺序(由用户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!)
Run Code Online (Sandbox Code Playgroud)

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


Nic*_*mer 9

我有

numpy.array(n * [value])
Run Code Online (Sandbox Code Playgroud)

记住,但显然这比所有其他建议要慢得多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,
    )
Run Code Online (Sandbox Code Playgroud)


tnu*_*nov 9

没有麻木

>>>[2]*3
[2, 2, 2]
Run Code Online (Sandbox Code Playgroud)


Rol*_*tra 7

你可以使用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]])
Run Code Online (Sandbox Code Playgroud)

虽然tile意图"平铺"一个数组(而不是标量,如本例所示),但它可以完成任务,创建任意大小和维度的预填充数组.