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 deuint16s:

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 ahoraint32s están siendo echados auint16s, que definitivamente no es una cosa segura de hacer:

>>> np.can_cast('int32', 'uint16')
False

Mi código funciona si configurolutdtype 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?

Respuestas a la pregunta(1)

Su respuesta a la pregunta