"Системная ошибка:вернул результат с набором ошибок "в Python - PullRequest
0 голосов
/ 15 декабря 2018

Я хотел применить очень простую функцию, используя ndimage.generic_filter() из scipy.Это код:

import numpy as np
import scipy.ndimage as ndimage

data = np.random.rand(400,128)
dimx = int(np.sqrt(np.size(data,0)))
dimy = dimx    
coord = np.random.randint(np.size(data,0), size=(dimx,dimy))

def test_func(values):
    idx_center = int(values[4])
    weight_center = data[idx_center]
    weights_around = data[values]
    differences = weights_around - weight_center
    distances = np.linalg.norm(differences, axis=1)
    return np.max(distances)

results = ndimage.generic_filter(coord,
                                 test_func,
                                 footprint = np.ones((3,3)))

Когда я его выполняю, появляется следующая ошибка:

SystemError: <class 'int'> returned a result with an error set

при попытке привести values[4] к int.Если я запускаю функцию test_func() без использования ndimage.generic_filter() для случайного массива values, функция работает нормально.

Почему возникает эта ошибка?Есть ли способ заставить его работать?

1 Ответ

0 голосов
/ 15 декабря 2018

Для вашего случая:

Это должно быть ошибкой либо в Python, либо в SciPy.Пожалуйста, отправьте сообщение об ошибке на https://bugs.python.org и / или https://www.scipy.org/bug-report.html. Включите номера версий Python и NumPy / SciPy, полный код, который у вас есть, и весь трассировку.

(Кроме того, если вы можете найти способ вызвать эту ошибку, которая не требует использования случайности, они, вероятно, оценят ее. Но если вы не можете найти такой метод, пожалуйста, сохраните его как есть.)

В общем:

«[R] отменил результат с набором ошибок» - это то, что может быть сделано только на уровне C.В целом, API-интерфейс Python / C ожидает, что большинство функций C выполнят одно из двух действий:

  1. Установите исключение, используя одну из этих функций и возврат NULL (соответствуетвыдает исключение).
  2. Не устанавливайте исключение и возвращайте «реальное» значение, обычно PyObject* (соответствует возвращаемому значению, включая , возвращающему None).

Эти два случая обычно неверны:

Установить исключение (или не очистить уже существующее), но затем вернуть какое-либо значение, отличное от NULL. Не устанавливать исключение, а затем вернуть NULL.

Python вызывает SystemError, потому что реализация int в стандартной библиотеке Python пыталась выполнить (3), возможно, в результате того, что SciPy это сделал первым.Это всегда неправильно, поэтому должна быть ошибка либо в Python, либо в коде SciPy, в который он был вызван.

...