Tôi có một loạt các byte có ký tự lớn (dtype int8
). Nó chứa các giá trị trong phạm vi đầy đủ -128 đến +127. Tôi muốn chuyển đổi hiệu quả thành mảng byte chưa ký (dtype uint8
) bằng cách thêm 128 cho mỗi phần tử, chẳng hạn như -128 → 0, 0 → 128, +127 → 255, , v.v. vì vậy tất nhiên vẫn có kết quả phù hợp với một byte chưa ký.Làm thế nào tôi có thể chuyển đổi hiệu quả mảng numpy.int8 tại chỗ thành mảng numpy.uint8 có giá trị chuyển dịch?
Thêm phần tử đơn giản cho kết quả số chính xác, nhưng tạo mảng kết quả bằng cách sử dụng hai lần bộ nhớ (dtype int16
) ngoài mảng nguồn, mặc dù chỉ cần có byte thấp của các phần tử kết quả.
>>> import numpy
>>> a = numpy.array([-128, -1, 0, 1, 127 ], dtype=numpy.int8)
>>> b = a + 128
>>> b
array([ 0, 127, 128, 129, 255], dtype=int16)
Có cách nào để kiểm soát dtype
của mảng kết quả là uint8
?
Phương pháp thay thế sửa đổi các giá trị tại chỗ và "đúc" các dữ liệu vào một loại mới, như thế này:
>>> for i in xrange(0, 5):
... if a[i] < 0:
... a[i] -= 128
... elif a[i] >= 0:
... a[i] += 128
...
>>> a
array([ 0, 127, -128, -127, -1], dtype=int8)
>>> a.view(dtype=numpy.uint8)
array([ 0, 127, 128, 129, 255], dtype=uint8)
là nhiều hơn nữa không gian hiệu quả nhưng rất tốn kém trong thời gian cho mảng lớn với chuyển đổi bằng Python.
Tôi có thể thực hiện chuyển đổi này tại chỗ và nhanh chóng như thế nào?
Cảm ơn bạn. Nó đã không xảy ra với tôi để khai thác bọc unsigned xung quanh kết hợp với các nhà điều hành add-assign để có một số kiểm soát đối với loại kết quả của tổng. –