我正在尝试使用numpy.fromfunction计算由函数定义的数组,但是出现了我不理解的错误。
d_matrix是一个距离矩阵,并且我得到的错误消息是“具有多个元素的数组的真值不明确。请使用a.any()或a.all()”。我将dtype = int放在np.fromfunction中,因为我读到了可能的解决方案。
def v(r, i):
return 1/N*np.sum(d_matrix[i,:]<r)
def rho_barre(r):
return quad(rho, r, np.inf)[0]
def grad_F(i, j):
return quad( lambda r : ( (v(r, i) + v(r, j))/2 - v_r) * rho_barre(max(r, d_matrix[i,j])), 0, np.inf)[0]
Grad_F = np.fromfunction(lambda i, j: grad_F(i,j), (N,N), dtype=int)
我想知道是否有人可以帮助我解决此错误,更一般而言,是否有人对如何计算函数定义的数组有想法。我不确定我正在做最快的事情
答案 0 :(得分:1)
如评论中所指出,np.fromfunction
提供了索引数组,而不是单个索引元组。这是一个常见的错误,但是使用索引数组通常效率更高。如果确实一次必须产生一个值,则可以改用这样的函数:
import numpy as np
def fromfunction_iter(function, shape, dtype=None):
# Iterator over all index tuples
iter = np.ndindex(*shape)
# First index
idx = next(iter)
# Produce first value
value = function(*idx)
# Make it into a NumPy value
value = np.asarray(value, dtype=dtype)
# Make output array of the right data type
out = np.empty(shape, dtype=value.dtype)
# Set first value
out[idx] = value
# Fill rest of values
for idx in iter:
out[idx] = function(*idx)
return out
但是,这通常会慢很多,实际上,如果您必须对NumPy数据运行像这样的迭代算法,则要使其真正快速地运行,可能需要研究像Numba这样的东西。