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 konvertierenuint16
s:
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, seitdemint32
s werden nach besetztuint16
s, 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?