让A1和A2成为相同形状的numpy数组,比如说((d1,d2))。我想从它构建((d1,d1))数组,以便通过将函数应用于元组A1 [i],A2 [j]来定义其第[i,j]个条目。我以
的形式使用np.fromfunctionf=lambda i,j: np.inner(A1[i],A2[j])
A=np.fromfunction(f, shape=(d1, d1))
(如Fastest way to initialize numpy array with values given by function中所述)。
但是我得到错误'' IndexError:用作索引的数组必须是整数(或布尔)类型''。这很奇怪,因为将lambda函数更改为例如
f=lambda i,j: i*j
工作正常!似乎在lambda函数中调用另一个函数会导致
出现问题np.fromfunction
(np.inner只是一个例子,我希望能够用其他类似的功能替换它。)
答案 0 :(得分:7)
要调试情况,请使f
成为正确的函数并添加print语句以查看i
和j
的值:
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)