Python中的“ SystemError:<class'int'=“”>返回了带有错误集的结果”

时间:2018-12-15 18:52:51

标签: python scipy runtime-error

我想使用Right _中的import Control.Monad (foldM) import Data.List (sort) import Data.Bool (bool) anyDupe' :: (Eq a, Ord a, Enum a) => [a] -> Either a a anyDupe' xs = foldM f i $ sort xs where i = succ $ head xs -- prevent the initial value to be equal with the value at the head f = \b a -> bool (Left a) (Right a) (a /= b) *Main> anyDupe' [1,2,3,4,5] Right 5 *Main> anyDupe' [3,3,6,1] Left 3 *Main> anyDupe' $ 1:[10^7,(10^7-1)..1] Left 1 (2.97 secs, 1,040,110,448 bytes) *Main> anyDupe $ 1:[10^7,(10^7-1)..1] Left 1 (2.94 secs, 1,440,112,888 bytes) *Main> anyDupe' $ [1..10^7]++[10^7] Left 10000000 (5.71 secs, 3,600,116,808 bytes) -- winner by far *Main> anyDupe $ [1..10^7]++[10^7] -- don't try at home, it's waste of energy 应用一个非常简单的函数。这是代码:

anyDupe'

但是当我执行它时,出现以下错误:

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,则该函数可以正常工作。

为什么会发生此错误?有办法使它起作用吗?

2 个答案:

答案 0 :(得分:2)

针对您的情况:

这必须是Python或SciPy中的错误。请在rusqlite和/或https://bugs.python.org处提交错误。包括Python和NumPy / SciPy的版本号,您在此处拥有的完整代码以及整个回溯。

(此外,如果您找到一种无需使用随机性即可触发此错误的方法,他们可能会很感激。但是,如果您找不到这种方法,请按照以下方式归档:是。

通常:

“ [R]返回的结果带有错误集”是只能在C级别执行的操作。  通常,Python / C API期望大多数C函数执行以下两项操作之一:

  1. 使用https://www.scipy.org/bug-report.html之一设置例外并返回NULL(相当于引发例外)。
  2. 不要设置异常并返回“真实”值,通常为PyObject*(对应于返回值,包括these functions)。

这两种情况通常是不正确的:

  1. 设置一个异常(或无法清除已经存在的异常),然后返回除NULL以外的其他值。
  2. 不设置例外,但返回NULL

Python之所以提出SystemError是因为Python标准库中int的实现试图做到(3),这可能是SciPy首先这样做的结果。这始终是错误的,因此Python或其调用的SciPy代码中肯定存在错误。

答案 1 :(得分:0)

我在Linux上使用Python 3.8.1和SciPy 1.4.1的经历非常相似。一种解决方法是引入np.floor,以便:

centre = int(window.size / 2)变为centre = int(np.floor(window.size/2))

似乎已经解决了问题。