将numpymatrix初始化为零或一个以外的东西

我有以下代码:

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

它创build一个宽度为x高度x 9matrix填充零。 相反,我想知道是否有一个函数或方法来初始化他们,而不是NaN。

有没有? 而不必诉诸手动做循环等?

谢谢

在numpy中,你很less需要循环的vector操作。 您可以创build一个未初始化的数组并一次赋值给所有条目:

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

我已经在a.fill(numpy.nan)公布的时间里selecta[:] = numpy.nana.fill(numpy.nan)

 $ 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(..)作为更快的select。 OTOH,我喜欢numpy的便利实现,你可以在这个时候给整个切片赋值,代码的意图非常清晰。

另一种select是使用np.full ,NumPy 1.8+中的一个选项

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

这是非常灵活的,你可以填写任何你想要的其他号码。

你是否熟悉numpy.nan

您可以创build自己的方法,如:

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

然后

 nans([3,4]) 

会输出

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

我在邮件列表线程中find了这个代码。

如果您不立即记得.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 

我比较了build议的速度替代方法,发现对于足够大的向量/matrix来说,除了val * onesarray(n * [val])以外,所有的替代方法都是同样快的。

在这里输入图像说明


代码重现情节:

 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]) perfplot.show( setup=lambda n: n, kernels=[fill, colon, full, ones_times, list], n_range=[2**k for k in range(20)], logx=True, logy=True, xlabel='len(a)' ) 

如上所述,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)