我有以下代码:
r = numpy.zeros(shape = (width, height, 9))
它创建了一个宽x高x 9的矩阵,全是0。相反,我想知道是否有一个函数或方法,以一种简单的方式将它们初始化为nan。
我有以下代码:
r = numpy.zeros(shape = (width, height, 9))
它创建了一个宽x高x 9的矩阵,全是0。相反,我想知道是否有一个函数或方法,以一种简单的方式将它们初始化为nan。
当前回答
请原谅我的迟到,但这里是大型数组的最快解决方案,iff单精度(f4 float32)是你所需要的。是的,np。南也在工作。
def full_single_prec(n):
return numpy.full(n, val, dtype='f4')
其他回答
在numpy中,矢量运算很少需要循环。 你可以创建一个未初始化的数组,并一次分配给所有条目:
>>> a = numpy.empty((3,3,))
>>> a[:] = numpy.nan
>>> a
array([[ NaN, NaN, NaN],
[ NaN, NaN, NaN],
[ NaN, NaN, NaN]])
我已经计时的替代方案a[:] = numpy。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(..)作为更快的替代方案。OTOH,我喜欢numpy的方便实现,在这里你可以同时为整个切片赋值,代码的意图非常明确。
注意ndarray。fill在原地执行操作,因此numpy.empty((3,3,)).fill(numpy.nan)将返回None。
这里还没有提到的另一种可能性是使用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
如前所述,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)
请原谅我的迟到,但这里是大型数组的最快解决方案,iff单精度(f4 float32)是你所需要的。是的,np。南也在工作。
def full_single_prec(n):
return numpy.full(n, val, dtype='f4')