意外结果 - 具有常量函数的函数 numpy



我本来以为np.fromfunction(lambda i: 1, (4,), dtype=int)会返回array([1, 1, 1, 1]),但它1返回整数。有人可以向我解释为什么numpy.fromfunction会这样吗?它似乎与匿名函数的定义有关(即,是否实际使用了函数的参数)。

>>> import numpy as np
>>> np.fromfunction(lambda i: i, (4,), dtype=int)
array([0, 1, 2, 3])
>>> np.fromfunction(lambda i: 1, (4,), dtype=int)
1
>>> np.fromfunction(lambda i: 1 + i*0, (4,), dtype=int)
array([1, 1, 1, 1])

编辑:澄清一下,我的最终目标不是使用这种方法创建array([1, 1, 1, 1])。相反,我正在调用表单

np.fromfunction(lambda i: **an expression that doesn't depend on i**, (n,))

换句话说,我试图通过反复调用某个函数来初始化 numpy 数组。(该函数中有一个对 np.random.random() 的调用,所以我不会进行多余的调用。

@Warren Weckesser解释了为什么会发生这种情况(NumPy文档在这里有点误导,没有任何地方明确表明fromfunction期待一个向量)。如果要使lambda函数与fromfunction一起使用,可以显式对其进行矢量化:

In [1]: func = lambda i: 1
In [1]: vfunc = np.vectorize(func)
In [2]: np.fromfunction(vfunc, (4,), dtype=int)
Out[2]: array([1, 1, 1, 1])

但是对于这个用例,我会认为

np.ones(4, dtype=int)

(也许乘以常数)会更好。

fromfunction文档字符串中func参数的文档中没有很好地解释func只调用一次,带有数组参数。

在此示例中

np.fromfunction(lambda i: i, (4,), dtype=int)

匿名函数被调用一次,参数i是数组 [0, 1, 2, 3]。 要验证这一点,您可以执行以下操作:

In [10] from __future__ import print_function
In [11]: np.fromfunction(lambda i: print("i = %r" % (i,)), (4,), dtype=int)
i = array([0, 1, 2, 3])

在本例中,func返回 1,

np.fromfunction(lambda i: 1, (4,), dtype=int)

由于单个调用返回的值为 1,因此创建的数组仅包含 1。

目前尚不清楚为什么要使用 fromfunction 来创建 1 数组而不是 np.ones ,但如果您想到更复杂的事情,这里有一种方法可以做到这一点,使用 np.ones_like

In [14]: np.fromfunction(lambda i: np.ones_like(i), (4,), dtype=int)
Out[14]: array([1, 1, 1, 1])

最新更新