代码之家  ›  专栏  ›  技术社区  ›  devoured elysium

创建填充NaN的numpy矩阵

  •  282
  • devoured elysium  · 技术社区  · 16 年前

    r = numpy.zeros(shape = (width, height, 9))
    

    width x height x 9 NaN 这很容易。

    11 回复  |  直到 6 年前
        1
  •  3
  •   Novorodnas    4 年前

    在numpy中,向量操作很少需要循环。 您可以创建一个未初始化的数组,并一次分配给所有条目:

    >>> a = numpy.empty((3,3,))
    >>> a[:] = numpy.nan
    >>> a
    array([[ NaN,  NaN,  NaN],
           [ NaN,  NaN,  NaN],
           [ NaN,  NaN,  NaN]])
    

    a[:] = numpy.nan 在这里和 a.fill(numpy.nan) 由Blaenk发布:

    $ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a.fill(np.nan)"
    10000 loops, best of 3: 54.3 usec per loop
    $ python -mtimeit "import numpy as np; a = np.empty((100,100));" "a[:] = np.nan" 
    10000 loops, best of 3: 88.8 usec per loop
    

    计时显示了以下偏好 ndarray.fill(..)

    请注意 ndarray.fill numpy.empty((3,3,)).fill(numpy.nan) 将返回 None .

        2
  •  2
  •   user19409802    4 年前

    numpy.full

    a = np.full([height, width, 9], np.nan)
    

        3
  •  1
  •   Larry Panozzo    3 年前

    我比较了建议的速度替代方案,发现对于足够大的向量/矩阵,除了 val * ones array(n * [val])

    enter image description here


    再现情节的代码:

    import numpy
    import perfplot
    
    val = 42.0
    
    
    def fill(n):
        a = numpy.empty(n)
        a.fill(val)
        return a
    
    
    def colon(n):
        a = numpy.empty(n)
        a[:] = val
        return a
    
    
    def full(n):
        return numpy.full(n, val)
    
    
    def ones_times(n):
        return val * numpy.ones(n)
    
    
    def list(n):
        return numpy.array(n * [val])
    
    
    b = perfplot.bench(
        setup=lambda n: n,
        kernels=[fill, colon, full, ones_times, list],
        n_range=[2 ** k for k in range(20)],
        xlabel="len(a)",
    )
    b.save("out.png")