我有以下代码:

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

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


当前回答

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

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

其他回答

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

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

我比较了建议的替代方案的速度,发现对于足够大的向量/矩阵来填充,除了val * ones和array(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])


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")

请原谅我的迟到,但这里是大型数组的最快解决方案,iff单精度(f4 float32)是你所需要的。是的,np。南也在工作。

def full_single_prec(n):
    return numpy.full(n, val, dtype='f4')

>>> width = 2
>>> height = 3

>>> r = np.full((width, height, 9), np.nan)

>>> print(r)

array([[[nan, nan, nan, nan, nan, nan, nan, nan, nan],
        [nan, nan, nan, nan, nan, nan, nan, nan, nan],
        [nan, nan, nan, nan, nan, nan, nan, nan, nan]],

       [[nan, nan, nan, nan, nan, nan, nan, nan, nan],
        [nan, nan, nan, nan, nan, nan, nan, nan, nan],
        [nan, nan, nan, nan, nan, nan, nan, nan, nan]]])

>>> r.shape
(2, 3, 9)

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

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

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