【问题标题】:Best way to initialize and fill an numpy array?初始化和填充 numpy 数组的最佳方法?
【发布时间】:2014-03-14 19:32:15
【问题描述】:

我想初始化并填充一个numpy 数组。最好的方法是什么?

这符合我的预期:

>>> import numpy as np
>>> np.empty(3)
array([ -1.28822975e-231,  -1.73060252e-077,   2.23946712e-314])

但这不是:

>>> np.empty(3).fill(np.nan)
>>> 

什么都没有?

>>> type(np.empty(3))
<type 'numpy.ndarray'>

在我看来np.empty() 调用返回了正确类型的对象,所以我不明白为什么.fill() 不起作用?

首先分配np.empty() 的结果可以正常工作:

>>> a = np.empty(3)
>>> a.fill(np.nan)
>>> a
array([ nan,  nan,  nan])

为什么我需要分配一个变量才能使用np.fill()?我错过了更好的选择吗?

【问题讨论】:

    标签: python arrays numpy multidimensional-array initialization


    【解决方案1】:

    你也可以试试:

    In [79]: np.full(3, np.nan)
    Out[79]: array([ nan,  nan,  nan])
    

    相关文档:

    Definition: np.full(shape, fill_value, dtype=None, order='C')
    Docstring:
    Return a new array of given shape and type, filled with `fill_value`.
    

    虽然我认为这可能仅在 numpy 1.8+ 中可用

    【讨论】:

    • 这是正确的做法。如果您使用的是旧版本,则需要执行 np.zeros(3) + value
    【解决方案2】:

    np.fill 就地修改数组,并返回None。因此,如果您将结果分配给一个名称,它会得到一个值None

    另一种方法是使用返回 nan 的表达式,例如:

    a = np.empty(3) * np.nan
    

    【讨论】:

    • 但是请注意,这不适用于通用值,@JoshAdel 的答案对于 NumPy 1.8+ 更好,而对于早期版本 np.zeros(shape) + value 应该使用。请参阅我的答案了解时间。
    【解决方案3】:

    我觉得这很容易记住:

    numpy.array([numpy.nan]*3)
    

    出于好奇,我计时了,@JoshAdel's answer@shx2's answer 都比我的大数组快得多。

    In [34]: %timeit -n10000 numpy.array([numpy.nan]*10000)
    10000 loops, best of 3: 273 µs per loop
    
    In [35]: %timeit -n10000 numpy.empty(10000)* numpy.nan
    10000 loops, best of 3: 6.5 µs per loop
    
    In [36]: %timeit -n10000 numpy.full(10000, numpy.nan)
    10000 loops, best of 3: 5.42 µs per loop
    

    【讨论】:

      【解决方案4】:

      仅供参考,np.nan 的乘法仅适用于 np.nan 的数学属性。 对于通用值 N,需要使用 np.ones() * N 来模仿已接受的答案,但是,从速度上看,这不是一个非常好的选择。

      正如已经指出的那样,最佳选择是np.full(),如果您无法使用,np.zeros() + N 似乎是比np.ones() * N 更好的选择,而np.empty() + Nnp.empty() * N 根本不是合适的。请注意,np.zeros() + N 也可以在 Nnp.nan 时起作用。

      %timeit x = np.full((1000, 1000, 10), 432.4)
      8.19 ms ± 97.8 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      
      %timeit x = np.zeros((1000, 1000, 10)) + 432.4
      9.86 ms ± 55.1 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      
      %timeit x = np.ones((1000, 1000, 10)) * 432.4
      17.3 ms ± 104 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
      
      %timeit x = np.array([432.4] * (1000 * 1000 * 10)).reshape((1000, 1000, 10))
      316 ms ± 37.4 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
      

      【讨论】:

        【解决方案5】:

        如果你不介意None,可以使用:

        a = np.empty(3, dtype=object)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-18
          • 2015-12-02
          • 2020-12-28
          • 1970-01-01
          • 2018-03-09
          • 1970-01-01
          • 2011-11-24
          • 1970-01-01
          相关资源
          最近更新 更多