我希望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(),因此我没有进行冗余调用。)
答案 0 :(得分:7)
在 在这个例子中 匿名函数被调用一次,参数 在这种情况下, 因为单个调用返回的值为1,所创建的数组仅包含1。 目前尚不清楚为什么要使用fromfunction
文档字符串中func
参数的文档中没有很好地解释func
只用调用一次,带有数组参数。< / p>
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)
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])
答案 1 :(得分:7)
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)
(也许是一个常数)会更好。