2011-10-10 22 views
7

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?

Trả lời

14
 
import numpy as np 
a = np.array([-128, -1, 0, 1, 127], dtype=np.int8) 
a = a.view(np.uint8) 
a += 128 
print a 
# -> array([ 0, 127, 128, 129, 255], dtype=uint8) 

Thao tác này không tạo bản sao và tất cả các thao tác đều được thực hiện.

EDIT: an toàn hơn để bỏ đầu tiên đến uint --- không dấu bọc xung quanh được xác định. EDIT2: s/numpy/np/g;

+0

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

1
In [18]: a = numpy.array([-128, -1, 0, 1, 127 ], dtype=numpy.int8) 
In [19]: z = a.view(dtype=numpy.uint8) 

In [20]: z += 128 

In [21]: z 
Out[21]: array([ 0, 127, 128, 129, 255], dtype=uint8) 

Tôi hy vọng tôi đã không hiểu lầm các yêu cầu.

Các vấn đề liên quan