Mam look-up table (LUT), która przechowuje 65536 uint8
wartości:odlew z numpy.take
lut = np.random.randint(256, size=(65536,)).astype('uint8')
Chcę użyć tego LUT do konwersji wartości w tablicy uint16
s:
arr = np.random.randint(65536, size=(1000, 1000)).astype('uint16')
i chcę przeprowadzić konwersję w miejscu, ponieważ ta ostatnia tablica może być dość duża. Kiedy go wypróbuję, następuje:
I nie rozumiem, co się dzieje. Wiem, że bez argumentu out
, zwrot jest tego samego typu co lut
, czyli uint8
. Ale dlaczego nie można wykonać rzutowania na uint8
na uint16
? Jeśli zapytać numpy:
>>> np.can_cast('uint8', 'uint16')
True
Oczywiście następujące prace:
>>> 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)
Ale to działa również:
>>> 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)
To naprawdę nie ma sensu, ponieważ teraz int32
s są oddane do uint16
s, co zdecydowanie nie jest bezpieczne:
>>> np.can_cast('int32', 'uint16')
False
Mój kod działa, jeśli mogę ustawić dtype lut
jest do niczego w uint16
, uint32
, uint64
, int32
lub int64
, ale nie dla uint8
, int8
i int16
.
Czy czegoś brakuje, czy jest to po prostu łamane w numpy?
Obejścia są również mile widziane ... Ponieważ LUT nie jest tak duże, to chyba nie jest tak źle, że jego typ pasuje do tablicy, nawet jeśli zajmuje to dwa razy więcej miejsca, ale po prostu nie czuje się dobrze aby to zrobić ...
Czy istnieje sposób, aby powiedzieć numpy, aby nie przejmował się rzucaniem bezpieczeństwa?
Innym przypadkiem użycia jest float -> int indices, 'y.take (xfloat.astype (int), mode =" clip ")': unsafe without 'astype' ale common (well, in c) i useful . – denis