Tôi có một cái nhìn lên bảng (LUT) mà các cửa hàng 65536 uint8
giá trị:Loại đúc với numpy.take
lut = np.random.randint(256, size=(65536,)).astype('uint8')
Tôi muốn sử dụng LUT này để chuyển đổi các giá trị trong một mảng của uint16
s:
arr = np.random.randint(65536, size=(1000, 1000)).astype('uint16')
và tôi muốn thực hiện chuyển đổi tại chỗ, vì mảng cuối cùng này có thể khá lớn. Khi tôi thử, điều sau xảy ra:
Và tôi không hiểu điều gì đang diễn ra. Tôi biết rằng, không có đối số out
, lợi tức là của cùng một loại như lut
, vì vậy uint8
. Nhưng tại sao không thể uint8
được truyền tới một số uint16
? Nếu bạn hỏi NumPy:
>>> np.can_cast('uint8', 'uint16')
True
Rõ ràng các công việc sau:
>>> 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)
Nhưng điều này cũng làm việc:
>>> 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)
Điều này thực sự làm cho không có ý nghĩa, kể từ bây giờ int32
s đang được đúc để uint16
s, chắc chắn đó không phải là điều an toàn để làm:
>>> np.can_cast('int32', 'uint16')
False
Mã của tôi hoạt động nếu tôi đặt dtype các 's lut
để bất cứ điều gì trong uint16
, uint32
, uint64
, int32
hoặc int64
, nhưng không cho uint8
, int8
và int16
.
Tôi có thiếu thứ gì đó không, hoặc điều này đơn giản là bị hỏng trong không?
Cách giải quyết cũng được hoan nghênh ... Vì LUT không lớn, tôi đoán không tệ khi có loại khớp với mảng, ngay cả khi mất gấp đôi không gian, nhưng nó không cảm thấy đúng để làm điều đó ...
Có cách nào để bảo đảm không lo lắng về an toàn khi truyền?
Trường hợp sử dụng khác là float -> int index, 'y.take (xfloat.astype (int), mode =" clip ")': không an toàn mà không có 'astype' nhưng phổ biến (tốt, trong c) và hữu ích . – denis