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

Ala*_*n C 8 python 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])
Run Code Online (Sandbox Code Playgroud)

编辑:澄清一下,我的最终目标不是array([1, 1, 1, 1])使用这种方法创建.相反,我正在打电话给表格

np.fromfunction(lambda i: **an expression that doesn't depend on i**, (n,))
Run Code Online (Sandbox Code Playgroud)

换句话说,我试图通过反复调用某个函数来初始化一个numpy数组.(在该函数中调用了np.random.random(),因此我没有进行冗余调用.)

War*_*ser 7

在使用数组参数调用一次funcfromfunctiondocstring 中的参数的文档中没有很好地解释它.func

在这个例子中

np.fromfunction(lambda i: i, (4,), dtype=int)
Run Code Online (Sandbox Code Playgroud)

匿名函数被调用一次,参数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])
Run Code Online (Sandbox Code Playgroud)

在这种情况下,func返回1,

np.fromfunction(lambda i: 1, (4,), dtype=int)
Run Code Online (Sandbox Code Playgroud)

因为单个调用返回的值是1,所创建的数组只包含1.

目前尚不清楚为什么你想用来fromfunction创建一个1s的数组,而不是,比如说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])
Run Code Online (Sandbox Code Playgroud)

  • 这似乎很不直观.是否有一个功能可以完成OP的目的? (3认同)

xnx*_*xnx 7

@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])
Run Code Online (Sandbox Code Playgroud)

但对于这个用例,我已经想到了

np.ones(4, dtype=int)
Run Code Online (Sandbox Code Playgroud)

(也许是一个常数)会更好.