La conversión de matriz numpy no fue “segura”

Indexando una matriz numpy con otra, ambas se definen como dtype = ‘uint32’. Usar numpy.take para indexar y obtener un error de conversión no seguro. No he encontrado esto antes. ¿Alguna idea de lo que está pasando?

Python 2.7.8 |Anaconda 2.1.0 (32-bit)| (default, Jul 2 2014, 15:13:35) [MSC v.1500 32 bit (Intel)] on win32 Type "copyright", "credits" or "license()" for more information. >>> import numpy >>> numpy.__version__ '1.9.0' >>> a = numpy.array([9, 7, 5, 4, 3, 1], dtype=numpy.uint32) >>> b = numpy.array([1, 3], dtype=numpy.uint32) >>> c = a.take(b) Traceback (most recent call last): File "", line 1, in  c = a.take(b) TypeError: Cannot cast array data from dtype('uint32') to dtype('int32') according to the rule 'safe' 

Esto es bastante común cuando se trabajan funciones de NumPy que requieren índices o longitudes para ser especificadas (no es solo take , ver por ejemplo aquí ).

El problema es que, para fines de indexación, NumPy desea tratar su matriz uint32 como una matriz int32 (que probablemente sea el tipo entero “puntero” en su sistema de 32 bits, np.intp ) y desea np.intp a ese tipo .

No puede hacer esto de forma segura: algunos de los enteros en una matriz sin signo podrían no ser representables como un entero de 32 bits con signo. El error que ves refleja esto.

Esto significa que obtendrá el mismo error si b tiene dtype int64 o float dtype, pero no si es int32 o un dtype entero más pequeño.

Para lo que vale, esto no es un problema inmediato para la notación de indexación a[b] que permite la conversión no segura (pero generará un error si el índice está fuera de los límites). Pruebe, por ejemplo, a[2**31] – NumPy lanza a int32 pero luego se queja de que el índice -2147483648 está fuera de límites.