Tippe Casting-Fehler mit numpy.take

Ich habe eine Nachschlagetabelle (LUT), die 65536 speichertuint8 Werte:

lut = np.random.randint(256, size=(65536,)).astype('uint8')

Ich möchte diese LUT verwenden, um die Werte in einem Array von zu konvertierenuint16s:

arr = np.random.randint(65536, size=(1000, 1000)).astype('uint16')

und ich möchte die Konvertierung an Ort und Stelle durchführen, da dieses letzte Array ziemlich groß werden kann. Wenn ich es versuche, passiert Folgendes:

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

Und ich verstehe nicht, was los ist. Ich weiß das, ohne eineout Argument, der Rückgabetyp ist derselbe wielut, souint8. Aber warum kann nicht einuint8 gegossen werden zu auint16? Wenn Sie numpy fragen:

>>> np.can_cast('uint8', 'uint16')
True

Offensichtlich funktioniert folgendes:

>>> 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)

Das funktioniert aber auch:

>>> 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)

Das macht wirklich keinen Sinn, seitdemint32s werden nach besetztuint16s, was definitiv keine sichere Sache ist:

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

Mein Code funktioniert, wenn ich das einstellelut's dtype zu irgendetwas inuint16, uint32, uint64, int32 oderint64, scheitert aber füruint8, int8 undint16.

Vermisse ich etwas, oder ist das einfach nur kaputt?

Problemumgehungen sind ebenfalls willkommen ... Da die LUT nicht so groß ist, ist es wohl nicht so schlimm, dass ihr Typ mit dem des Arrays übereinstimmt, auch wenn das doppelt so viel Platz in Anspruch nimmt, aber es ist einfach nicht richtig, dies zu tun. ..

Gibt es eine Möglichkeit, Numpy zu sagen, er solle sich keine Sorgen um die Sicherheit beim Werfen machen?

Antworten auf die Frage(1)

Ihre Antwort auf die Frage