Tipo de error de conversión con numpy.take
Tengo una tabla de consulta (LUT) que almacena 65536uint8
valores:
lut = np.random.randint(256, size=(65536,)).astype('uint8')
Quiero usar esta LUT para convertir los valores en una matriz deuint16
s:
arr = np.random.randint(65536, size=(1000, 1000)).astype('uint16')
y quiero hacer la conversión en su lugar, porque esta última matriz puede ser bastante grande. Cuando lo intento, sucede lo siguiente:
>>> np.take(lut, arr, out=arr)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 103, in take
return take(indices, axis, out, mode)
TypeError: array cannot be safely cast to required type
Y no entiendo lo que está pasando. Lo sé, sin unout
argumento, el retorno es del mismo tipo quelut
, asi queuint8
. Pero ¿por qué no puedeuint8
ser echado a unuint16
? Si pides numpy:
>>> np.can_cast('uint8', 'uint16')
True
Obviamente los siguientes trabajos:
>>> lut = lut.astype('uint16')
>>> np.take(lut, arr, out=arr)
array([[173, 251, 218, ..., 110, 98, 235],
[200, 231, 91, ..., 158, 100, 88],
[ 13, 227, 223, ..., 94, 56, 36],
...,
[ 28, 198, 80, ..., 60, 87, 118],
[156, 46, 118, ..., 212, 198, 218],
[203, 97, 245, ..., 3, 191, 173]], dtype=uint16)
Pero esto también funciona:
>>> lut = lut.astype('int32')
>>> np.take(lut, arr, out=arr)
array([[ 78, 249, 148, ..., 77, 12, 167],
[138, 5, 206, ..., 31, 43, 244],
[ 29, 134, 131, ..., 100, 107, 1],
...,
[109, 166, 14, ..., 64, 95, 102],
[152, 169, 102, ..., 240, 166, 148],
[ 47, 14, 129, ..., 237, 11, 78]], dtype=uint16)
Esto realmente no tiene sentido, ya que ahoraint32
s están siendo echados auint16
s, que definitivamente no es una cosa segura de hacer:
>>> np.can_cast('int32', 'uint16')
False
Mi código funciona si configurolut
dtype a nada enuint16
, uint32
, uint64
, int32
oint64
, pero falla poruint8
, int8
yint16
.
¿Me estoy perdiendo algo, o esto simplemente se rompe en cantidad?
Las soluciones también son bienvenidas ... Ya que la LUT no es tan grande, creo que no es tan malo que su tipo coincida con el de la matriz, incluso si ocupa el doble de espacio, pero no se siente bien hacer eso. ..
¿Hay alguna manera de decirle a los adormecidos que no se preocupen por la seguridad del lanzamiento?