np.fromfunction

时间:2019-03-25 15:47:01

标签: python numpy

我正在尝试使用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)

我想知道是否有人可以帮助我解决此错误,更一般而言,是否有人对如何计算函数定义的数组有想法。我不确定我正在做最快的事情

1 个答案:

答案 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这样的东西。