Hành vi này dường như xuất phát từ một mong muốn dễ hiểu để tiếp tục đúc đến mức tối thiểu tuyệt đối.
Xem xét
z = np.uint8[255]
z + 1
# 256
type[z+1]
# numpy.int64
trong đó chữ 1
có loại int
. Dường như trong trường hợp đó, cả hai toán hạng được chọn vào NP.INT64. Nhưng điều này không liên quan gì đến kết quả!
zz = np.uint8[1]
type[zz + 1]
# numpy.int64
Tuy nhiên, việc đúc khác nhau nếu chúng ta sử dụng một mảng thay vì số nguyên đơn giản.
x = np.array[[255], dtype=np.uint8]
x + 1
# array[[0], dtype=uint8]
Dường như với tôi đây có lẽ là trường hợp vì nó sẽ là một nỗ lực tính toán lớn để tạo ra toàn bộ một mảng từ loại này sang loại khác, vì vậy điều này chỉ được thực hiện nếu nó biết chắc chắn 100% điều này sẽ cần thiết trước khi xem xét tất cả các phần tử mảng, tức là chỉ khi bản thân toán hạng khác không phù hợp với loại hiện tại. Trong thực tế, ngay cả khi chúng ta lấybefore looking at all the array elements, i.e. only if the other operand itself does not fit in the current type. In fact, even if we take
b = np.int16[1]
x+b
# array[[0], dtype=uint8]
Vì vậy, nó thực sự ném toán hạng tay phải thành một loại nhỏ hơn, tất cả để lưu loại của mảng. Mặt khác, khi thêm hai np.
Câu chuyện dài ngắn: - Bổ sung số nguyên đơn giản luôn tạo ra loại toán hạng lớn hơn - bổ sung một mảng numpy và số nguyên chuyển vào loại mảng nếu điều này đủ để thể hiện số nguyên, khác với loại số nguyên - Bổ sung hai mảng numpy vào loại toán hạng lớn hơn [như với hai số nguyên]
Tệp này chứa văn bản unicode hai chiều có thể được giải thích hoặc biên dịch khác với những gì xuất hiện dưới đây. Để xem xét, hãy mở tệp trong một trình soạn thảo cho thấy các ký tự Unicode ẩn. Tìm hiểu thêm về các ký tự unicode hai chiều
Cải thiện bài viết
Lưu bài viết
Cải thiện bài viết
Lưu bài viết
Đọc
Bàn luậnint.tobytes[]
Một đối tượng INT có thể được sử dụng để biểu diễn cùng một giá trị trong định dạng của byte. Số nguyên đại diện cho một byte, được lưu trữ dưới dạng một mảng có chữ số quan trọng nhất [MSB] được lưu trữ ở đầu hoặc cuối của mảng. & NBSP;int.to_bytes[]. The method is invoked on an int value, is not supported by Python 2 [requires minimum Python3] for execution.
Phương pháp 1: int.tobyte []int.to_bytes[length, byteorder]
Giá trị INT có thể được chuyển đổi thành byte bằng cách sử dụng phương thức int.to_bytes []. Phương pháp này được gọi trên một giá trị INT, không được hỗ trợ bởi Python 2 [yêu cầu Python3 tối thiểu] để thực hiện. :
Cú pháp: int.to_bytes [length, byteorder]
Đối số: & nbsp;“little” where most significant bit is stored at the end and least at the beginning, or big, where MSB is stored at start and LSB at the end.
Chiều dài - Chiều dài mong muốn của mảng trong byte.
ByteArder - thứ tự của mảng để thực hiện chuyển đổi INT sang byte. Byteorder có thể có các giá trị như là một trong những điều đáng kể nhất được lưu trữ ở cuối và ít nhất là ở đầu, hoặc lớn, trong đó MSB được lưu trữ khi bắt đầu và LSB ở cuối. & NBSP;
Ngoại lệ: & nbsp;
Python3
Overflowerror được trả về trong trường hợp chiều dài giá trị số nguyên không đủ lớn để được cung cấp theo chiều dài của mảng. & Nbsp;
Các chương trình sau đây minh họa việc sử dụng phương pháp này trong Python: & NBSP;
zz = np.uint8[1]
type[zz + 1]
# numpy.int64
7zz = np.uint8[1]
type[zz + 1]
# numpy.int64
8Python3
integer_val
=
5
zz = np.uint8[1]
type[zz + 1]
# numpy.int64
0____8 zz = np.uint8[1]
type[zz + 1]
# numpy.int64
2zz = np.uint8[1]
type[zz + 1]
# numpy.int64
3zz = np.uint8[1]
type[zz + 1]
# numpy.int64
4zz = np.uint8[1]
type[zz + 1]
# numpy.int64
5zz = np.uint8[1]
type[zz + 1]
# numpy.int64
6zz = np.uint8[1]
type[zz + 1]
# numpy.int64
7zz = np.uint8[1]
type[zz + 1]
# numpy.int64
8integer_val
=
1x = np.array[[255], dtype=np.uint8]
x + 1
# array[[0], dtype=uint8]
b'\n\x00\x00\x00\x00'
‘Converting integer to string and string to bytes
Đầu ra
- Phương pháp 2: Chuyển đổi số nguyên thành chuỗi và chuỗi thành byte & nbsp;
- Cách tiếp cận này hoạt động tương thích trong cả hai phiên bản Python, 2 và 3. Phương pháp này không có độ dài của mảng và byteorder làm đối số. & NBSP;
Python3
Một giá trị số nguyên được biểu thị theo định dạng thập phân có thể được chuyển đổi thành chuỗi trước tiên bằng hàm str [], lấy làm đối số giá trị số nguyên sẽ được chuyển đổi thành tương đương chuỗi tương ứng.
Chuỗi này tương đương sau đó được chuyển đổi thành một chuỗi byte bằng cách chọn biểu diễn mong muốn cho mỗi ký tự, đó là mã hóa giá trị chuỗi. Điều này được thực hiện bằng phương thức str.encode [].
b = np.int16[1]
x+b
# array[[0], dtype=uint8]
1=
5
zz = np.uint8[1]
type[zz + 1]
# numpy.int64
7b'\n\x00\x00\x00\x00'2