用numpys np.fromfunction计算Python lambda函数



设A1和A2为相同形状的numpy数组,设((d1,d2))。我想从它构建((d1,d1))数组,这样它的[I,j]第一个条目是通过对元组A1[I],A2[j]应用一个函数来定义的。我以

的形式使用np.fromfunction
f=lambda i,j: np.inner(A1[i],A2[j])
A=np.fromfunction(f, shape=(d1, d1)) 

(根据函数给出的值初始化numpy数组的最快方法)。

然而,我得到错误"IndexError:用作索引的数组必须是整数(或布尔)类型"。这很奇怪,因为将lambda函数更改为例如

 f=lambda i,j: i*j

没问题!似乎在lambda函数中调用另一个函数会导致

出现问题
np.fromfunction

(np。inner只是一个例子,我希望能够用其他这样的函数来代替它)

为了调试这种情况,将f设置为合适的函数,并添加一条print语句来查看ij的值:

import numpy as np
np.random.seed(2015)
d1, d2 = 5, 3
A1 = np.random.random((d1,d2))
A2 = np.random.random((d1,d2))
def f(i, j):
    print(i, j)
    return np.inner(A1[i],A2[j])
A = np.fromfunction(f, shape=(d1, d1)) 

你会看到(i, j)等于:

(array([[ 0.,  0.,  0.,  0.,  0.],
       [ 1.,  1.,  1.,  1.,  1.],
       [ 2.,  2.,  2.,  2.,  2.],
       [ 3.,  3.,  3.,  3.,  3.],
       [ 4.,  4.,  4.,  4.,  4.]]), array([[ 0.,  1.,  2.,  3.,  4.],
       [ 0.,  1.,  2.,  3.,  4.],
       [ 0.,  1.,  2.,  3.,  4.],
       [ 0.,  1.,  2.,  3.,  4.],
       [ 0.,  1.,  2.,  3.,  4.]]))

啊哈。问题是这些数组是浮点的。如错误信息所示,索引必须为整型或布尔型。

仔细查看np.fromfunction的文档字符串,发现它有第三个参数dtype,它控制坐标数组的数据类型:

Parameters
dtype : data-type, optional
    Data-type of the coordinate arrays passed to `function`.
    By default, `dtype` is float.
因此,解决方案是将dtype=int添加到对np.fromfunction的调用中:
A = np.fromfunction(f, shape=(d1, d1), dtype=int) 

相关内容

  • 没有找到相关文章