代码为fromfunction
is:
dtype = kwargs.pop('dtype', float)
args = indices(shape, dtype=dtype)
return function(*args, **kwargs)
你看它调用function
只需一次 - 整个数组indices
。它不是迭代的。
In [672]: idx = np.indices((3,3))
In [673]: idx
Out[673]:
array([[[0, 0, 0],
[1, 1, 1],
[2, 2, 2]],
[[0, 1, 2],
[0, 1, 2],
[0, 1, 2]]])
您的 lambda 需要标量i,j
值,而不是 3d 数组
lambda i,j: 1 if i < k else 0
idx<3
是一个 3d 布尔数组。当它用于if
语境。
np.vectorize
or np.frompyfunc
如果您想将标量函数应用于一组数组,则更好:
In [677]: np.vectorize(lambda i,j: 1 if i < 2 else 0)(idx[0],idx[1])
Out[677]:
array([[1, 1, 1],
[1, 1, 1],
[0, 0, 0]])
然而,它并不比更直接的迭代方法更快,而且比在整个数组上运行的函数慢得多。
许多全阵列方法之一:
In [680]: np.where(np.arange(3)[:,None]<2, np.ones((3,3),int), np.zeros((3,3),int))
Out[680]:
array([[1, 1, 1],
[1, 1, 1],
[0, 0, 0]])