«Истинное значение массива неоднозначно» ошибка с функцией np.from - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь использовать функцию numpy.from для вычисления массива, определенного функцией, но я получил ошибку, которую не понимаю.

d_matrix - это матрица расстояний, и я получаю сообщение об ошибке: «Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all ()». Я поместил dtype = int в функцию np.from, потому что я прочитал, что это может помочь.

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 Ответ

1 голос
/ 25 марта 2019

Как отмечено в комментариях, 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, если вы хотите, чтобы он работал очень быстро.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...