首页 文章

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

提问于
浏览
168

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

还有什么比:

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

我知道 zerosones 适用于v = 0,1 . 我可以使用 v * ones(n) ,但是当 vNone 时它不会工作,而且速度也会慢得多 .

7 回答

  • 82

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

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

  • 13

    Updated for 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
    
  • 6

    我相信fill是最快的方法 .

    a = np.empty(10)
    a.fill(7)
    

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

  • 56

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

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

  • 9

    我有

    numpy.array(n * [value])
    

    记住,但显然这比所有其他建议要慢得多 n .

    这里与perfplot(我的宠物项目)进行了全面比较 .

    enter image description here

    两个 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,
        )
    
  • 207

    您可以使用 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 是指'tile'数组(而不是标量,如本例所示),但它可以完成任务,创建任意大小和维度的预填充数组 .

  • 0

    没有numpy

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

相关问题