我有以下代码:

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

它创建了一个宽x高x 9的矩阵,全是0。相反,我想知道是否有一个函数或方法,以一种简单的方式将它们初始化为nan。


当前回答

你熟悉numpy.nan吗?

你可以创建你自己的方法,比如:

def nans(shape, dtype=float):
    a = numpy.empty(shape, dtype)
    a.fill(numpy.nan)
    return a

Then

nans([3,4])

将输出

array([[ NaN,  NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN,  NaN]])

我在一个邮件列表线程中找到了这个代码。

其他回答

如前所述,numpy.empty()是可行的方法。然而,对于对象,fill()可能并不完全像你想象的那样:

In[36]: a = numpy.empty(5,dtype=object)
In[37]: a.fill([])
In[38]: a
Out[38]: array([[], [], [], [], []], dtype=object)
In[39]: a[0].append(4)
In[40]: a
Out[40]: array([[4], [4], [4], [4], [4]], dtype=object)

一种方法可以是:

In[41]: a = numpy.empty(5,dtype=object)
In[42]: a[:]= [ [] for x in range(5)]
In[43]: a[0].append(4)
In[44]: a
Out[44]: array([[4], [], [], [], []], dtype=object)

另一种替代方法是numpy.broadcast_to(val,n),它在常量时间内返回,与大小无关,也是内存效率最高的(它返回重复元素的视图)。需要注意的是返回值是只读的。

下面是使用与Nico Schlömer的答案相同的基准测试提出的所有其他方法的性能比较。

另一种选择是使用numpy。full, NumPy 1.8+中可用的选项

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

这是非常灵活的,你可以用任何你想要的数字来填充它。

这里还没有提到的另一种可能性是使用NumPy平铺:

a = numpy.tile(numpy.nan, (3, 3))

也给了

array([[ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN],
       [ NaN,  NaN,  NaN]])

我不知道速度比较。

如果你没有立即回忆起.empty或.full方法,你总是可以使用乘法:

>>> np.nan * np.ones(shape=(3,2))
array([[ nan,  nan],
       [ nan,  nan],
       [ nan,  nan]])

当然,它也适用于任何其他数值:

>>> 42 * np.ones(shape=(3,2))
array([[ 42,  42],
       [ 42,  42],
       [ 42, 42]])

但是@u0b34a0f6ae接受的答案是快3倍(CPU周期,而不是大脑周期来记住numpy语法;):

$ python -mtimeit "import numpy as np; X = np.empty((100,100));" "X[:] = np.nan;"
100000 loops, best of 3: 8.9 usec per loop
(predict)laneh@predict:~/src/predict/predict/webapp$ master
$ python -mtimeit "import numpy as np; X = np.ones((100,100));" "X *= np.nan;"
10000 loops, best of 3: 24.9 usec per loop