Các đơn giản, cao cấp câu trả lời là NumPy lớp một hệ thống kiểu thứ hai trên đỉnh loại Python hệ thống.
Khi bạn yêu cầu type
đối tượng NumPy, bạn nhận được loại vùng chứa - một cái gì đó như numpy.ndarray
. Nhưng khi bạn yêu cầu dtype
, bạn sẽ nhận được loại (một phần được quản lý gọn gàng) của các yếu tố .
>>> from numpy import *
>>> arr = array([1.0, 4.0, 3.14])
>>> type(arr)
<type 'numpy.ndarray'>
>>> arr.dtype
dtype('float64')
Đôi khi, như khi sử dụng các loại mặc định float
, các kiểu dữ liệu nguyên tố (dtype
) là tương đương với một loại Python. Nhưng đó là tương đương, không giống hệt nhau:
>>> arr.dtype == float
True
>>> arr.dtype is float
False
Trong trường hợp khác, không có loại Python tương đương. Ví dụ: khi bạn chỉ định uint8
. Các giá trị/kiểu dữ liệu như vậy có thể được Python quản lý, nhưng không giống như trong C, Rust và các ngôn ngữ hệ thống khác, quản lý các giá trị thẳng hàng với các kiểu dữ liệu máy (như uint8
liên kết chặt chẽ với tính toán "unsigned bytes") use-case cho Python.
Vì vậy, câu chuyện lớn là NumPy cung cấp các vùng chứa như mảng và ma trận hoạt động theo hệ thống kiểu riêng của nó. Và nó cung cấp một loạt các thói quen hữu ích, được tối ưu hóa tốt để hoạt động trên các thùng chứa đó (và các phần tử của chúng). Bạn có thể trộn và so khớp NumPy và tính toán Python bình thường, nếu bạn sử dụng dịch vụ chăm sóc.
Không có loại Python uint8
.Có một hàm constructor tên uint8
, mà khi gọi trở lại một loại NumPy: "Tôi có thể tạo ra một loạt các loại (không dtype) uint8 ..."
>>> u = uint8(44)
>>> u
44
>>> u.dtype
dtype('uint8')
>>> type(u)
<type 'numpy.uint8'>
Vì vậy, Không, bạn không thể. Không có động vật như vậy. Bạn có thể tính toán bị ràng buộc thành các quy tắc uint8
mà không sử dụng NumPy arrays
(giá trị vô hướng NumPy). Ví dụ:
>>> uint8(44 + 1000)
20
>>> uint8(44) + uint8(1000)
20
Nhưng nếu bạn muốn để tính toán giá trị mod 256, nó có thể dễ dàng hơn để sử dụng mod điều hành của Python:
>> (44 + 1000) % 256
20
Driving dữ liệu giá trị lớn hơn 255 thành uint8
kiểu dữ liệu và sau đó thực hiện số học là một cách khá xa để có được số học mod-256. Nếu bạn không cẩn thận, bạn sẽ khiến Python "nâng cấp" giá trị của bạn thành số nguyên đầy đủ (tiêu diệt mod-256), hoặc kích hoạt các ngoại lệ tràn (vì các thủ thuật hoạt động tốt trong ngôn ngữ C và máy thường được gắn cờ bởi ngôn ngữ cấp cao hơn).
"' dtype' chỉ định nghĩa cách byte trong bộ nhớ sẽ được giải thích bởi một vô hướng" → nó cũng xác định cách thức mà họ đang giải thích (ví dụ. 'Int32' vs' float32'). – Veedrac
Cảm ơn, Veedrac, tôi đã thực hiện câu đó chính xác hơn một chút. –