NumPy hỗ trợ nhiều loại số hơn nhiều so với Python. Phần này hiển thị những cái có sẵn và cách sửa đổi kiểu dữ liệu của một mảng
Các kiểu nguyên thủy được hỗ trợ được gắn chặt với các kiểu trong C
loại gọn gàng
loại C
Sự miêu tả
bool
Boolean [Đúng hoặc Sai] được lưu dưới dạng byte
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]1
nền tảng được xác định
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]3
nền tảng được xác định
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]5
nền tảng được xác định
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]7
nền tảng được xác định
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]9
nền tảng được xác định
>>> z.astype[float] array[[0., 1., 2.]] >>> np.int8[z] array[[0, 1, 2], dtype=int8]1
nền tảng được xác định
>>> z.astype[float] array[[0., 1., 2.]] >>> np.int8[z] array[[0, 1, 2], dtype=int8]3
nền tảng được xác định
>>> z.astype[float] array[[0., 1., 2.]] >>> np.int8[z] array[[0, 1, 2], dtype=int8]5
nền tảng được xác định
>>> z.astype[float] array[[0., 1., 2.]] >>> np.int8[z] array[[0, 1, 2], dtype=int8]7
nền tảng được xác định
>>> z.astype[float] array[[0., 1., 2.]] >>> np.int8[z] array[[0, 1, 2], dtype=int8]9
nền tảng được xác định
/
Phao nửa chính xác. bit dấu, 5 bit số mũ, 10 bit định trị
>>> z.dtype dtype['uint8']3
Phao chính xác đơn do nền tảng xác định. bit dấu thông thường, số mũ 8 bit, phần định trị 23 bit
>>> z.dtype dtype['uint8']5
Phao chính xác kép do nền tảng xác định. bit dấu thông thường, số mũ 11 bit, phần định trị 52 bit
>>> z.dtype dtype['uint8']7
Phao có độ chính xác mở rộng do nền tảng xác định
>>> z.dtype dtype['uint8']9
Số phức, được biểu thị bằng hai số float có độ chính xác đơn [các thành phần thực và ảo]
>>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False1
Số phức, được biểu thị bằng hai số float có độ chính xác kép [thành phần thực và ảo]
>>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False3
Số phức, được biểu thị bằng hai số float có độ chính xác mở rộng [các thành phần thực và ảo]
Vì nhiều trong số này có các định nghĩa phụ thuộc vào nền tảng nên một tập hợp các bí danh có kích thước cố định được cung cấp [Xem phần ]
Các kiểu số NumPy là các thể hiện của các đối tượng
>>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False4 [kiểu dữ liệu], mỗi đối tượng có các đặc điểm riêng. Sau khi bạn đã nhập NumPy bằng cách sử dụng
>>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False5, các loại dtype có sẵn là
>>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False6,
>>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False7, v.v.
Các loại nâng cao, không được liệt kê ở trên, được khám phá trong phần
Có 5 kiểu số cơ bản biểu diễn boolean [bool], số nguyên [int], số nguyên không dấu [uint] dấu phẩy động [float] và số phức. Những người có số trong tên của họ cho biết kích thước bit của loại [i. e. cần bao nhiêu bit để biểu diễn một giá trị trong bộ nhớ]. Một số loại, chẳng hạn như
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]9 và
>>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False9, có kích thước bit khác nhau, tùy thuộc vào nền tảng [e. g. 32-bit so với. máy 64-bit]. Điều này nên được tính đến khi giao tiếp với mã cấp thấp [chẳng hạn như C hoặc Fortran] nơi xử lý bộ nhớ thô
Kiểu dữ liệu có thể được sử dụng làm hàm để chuyển đổi số python thành vô hướng mảng [xem phần vô hướng mảng để được giải thích], chuỗi số python thành mảng thuộc loại đó hoặc làm đối số cho từ khóa dtype mà nhiều hàm hoặc phương thức numpy chấp nhận. Vài ví dụ
>>> x = np.float32[1.0] >>> x 1.0 >>> y = np.int_[[1,2,4]] >>> y array[[1, 2, 4]] >>> z = np.arange[3, dtype=np.uint8] >>> z array[[0, 1, 2], dtype=uint8]
Các loại mảng cũng có thể được gọi bằng mã ký tự, chủ yếu để duy trì khả năng tương thích ngược với các gói cũ hơn như Numeric. Một số tài liệu vẫn có thể đề cập đến những điều này, ví dụ
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]
Chúng tôi khuyên bạn nên sử dụng các đối tượng dtype để thay thế
Để chuyển đổi kiểu của một mảng, hãy sử dụng. astype[] [được ưu tiên] hoặc chính loại đó là một hàm. Ví dụ
>>> z.astype[float] array[[0., 1., 2.]] >>> np.int8[z] array[[0, 1, 2], dtype=int8]
Lưu ý rằng, ở trên, chúng tôi sử dụng đối tượng float Python làm dtype. NumPy biết rằng
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]9 đề cập đến
>>> np.power[100, 8, dtype=np.int64] 10000000000000000 >>> np.power[100, 8, dtype=np.int32] 18749194241,
bool
có nghĩa là >>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False6, rằng
>>> z.dtype dtype['uint8']3 là
>>> np.power[100, 8, dtype=np.int64] 10000000000000000 >>> np.power[100, 8, dtype=np.int32] 18749194245 và
>>> np.power[100, 8, dtype=np.int64] 10000000000000000 >>> np.power[100, 8, dtype=np.int32] 18749194246 là
>>> np.power[100, 8, dtype=np.int64] 10000000000000000 >>> np.power[100, 8, dtype=np.int32] 18749194247. Các kiểu dữ liệu khác không có Python tương đương
Để xác định loại mảng, hãy xem thuộc tính dtype
>>> z.dtype dtype['uint8']
các đối tượng dtype cũng chứa thông tin về loại, chẳng hạn như độ rộng bit và thứ tự byte của nó. Kiểu dữ liệu cũng có thể được sử dụng gián tiếp để truy vấn các thuộc tính của kiểu, chẳng hạn như đó có phải là số nguyên hay không
>>> d = np.dtype[int] >>> d dtype['int32'] >>> np.issubdtype[d, np.integer] True >>> np.issubdtype[d, np.floating] False
Mảng vô hướng
NumPy thường trả về các phần tử của mảng dưới dạng vô hướng mảng [một vô hướng với một dtype được liên kết]. Hàm vô hướng mảng khác với hàm vô hướng Python, nhưng phần lớn chúng có thể được sử dụng thay thế cho nhau [ngoại lệ chính là dành cho các phiên bản Python cũ hơn v2. x, trong đó các đại lượng mảng số nguyên không thể đóng vai trò là chỉ số cho danh sách và bộ dữ liệu]. Có một số trường hợp ngoại lệ, chẳng hạn như khi mã yêu cầu các thuộc tính rất cụ thể của một đại lượng vô hướng hoặc khi nó kiểm tra cụ thể xem một giá trị có phải là đại lượng vô hướng trong Python hay không. Nói chung, các sự cố có thể dễ dàng khắc phục bằng cách chuyển đổi rõ ràng các hàm vô hướng mảng thành hàm vô hướng Python, sử dụng hàm loại Python tương ứng [e. g. ,
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]9,
>>> z.dtype dtype['uint8']3,
>>> np.power[100, 8, dtype=np.int64] 10000000000000000 >>> np.power[100, 8, dtype=np.int32] 18749194246,
>>> np.iinfo[int] # Bounds of the default integer on this system. iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64] >>> np.iinfo[np.int32] # Bounds of a 32-bit integer iinfo[min=-2147483648, max=2147483647, dtype=int32] >>> np.iinfo[np.int64] # Bounds of a 64-bit integer iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64]1,
>>> np.iinfo[int] # Bounds of the default integer on this system. iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64] >>> np.iinfo[np.int32] # Bounds of a 32-bit integer iinfo[min=-2147483648, max=2147483647, dtype=int32] >>> np.iinfo[np.int64] # Bounds of a 64-bit integer iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64]2]
Ưu điểm chính của việc sử dụng mảng vô hướng là chúng bảo toàn kiểu mảng [Python có thể không có sẵn kiểu vô hướng phù hợp, e. g.
>>> np.iinfo[int] # Bounds of the default integer on this system. iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64] >>> np.iinfo[np.int32] # Bounds of a 32-bit integer iinfo[min=-2147483648, max=2147483647, dtype=int32] >>> np.iinfo[np.int64] # Bounds of a 64-bit integer iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64]3]. Do đó, việc sử dụng mảng vô hướng đảm bảo hành vi giống hệt nhau giữa mảng và vô hướng, bất kể giá trị có nằm trong mảng hay không. Vô hướng NumPy cũng có nhiều phương thức giống như mảng
Lỗi tràn
Kích thước cố định của các loại số NumPy có thể gây ra lỗi tràn khi một giá trị yêu cầu nhiều bộ nhớ hơn khả dụng trong loại dữ liệu. Ví dụ: đánh giá đúng
>>> np.iinfo[int] # Bounds of the default integer on this system. iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64] >>> np.iinfo[np.int32] # Bounds of a 32-bit integer iinfo[min=-2147483648, max=2147483647, dtype=int32] >>> np.iinfo[np.int64] # Bounds of a 64-bit integer iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64]5 cho số nguyên 64 bit, nhưng đưa ra 1874919424 [không chính xác] cho số nguyên 32 bit
>>> np.power[100, 8, dtype=np.int64] 10000000000000000 >>> np.power[100, 8, dtype=np.int32] 1874919424
Hành vi của các loại số nguyên NumPy và Python khác nhau đáng kể khi tràn số nguyên và có thể gây nhầm lẫn cho người dùng mong đợi các số nguyên NumPy hoạt động tương tự như
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]9 của Python. Không giống như NumPy, kích thước của
>>> np.array[[1, 2, 3], dtype='f'] array[[1., 2., 3.], dtype=float32]9 của Python rất linh hoạt. Điều này có nghĩa là số nguyên Python có thể mở rộng để chứa bất kỳ số nguyên nào và sẽ không bị tràn
NumPy cung cấp và để xác minh các giá trị tối thiểu hoặc tối đa của các giá trị số nguyên và dấu phẩy động NumPy tương ứng
>>> np.iinfo[int] # Bounds of the default integer on this system. iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64] >>> np.iinfo[np.int32] # Bounds of a 32-bit integer iinfo[min=-2147483648, max=2147483647, dtype=int32] >>> np.iinfo[np.int64] # Bounds of a 64-bit integer iinfo[min=-9223372036854775808, max=9223372036854775807, dtype=int64]
Nếu số nguyên 64 bit vẫn còn quá nhỏ, kết quả có thể được chuyển thành số dấu phẩy động. Các số dấu phẩy động cung cấp phạm vi giá trị có thể lớn hơn nhưng không chính xác
>>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+200
Độ chính xác mở rộng
Số dấu phẩy động của Python thường là số dấu phẩy động 64-bit, gần tương đương với
>>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+2000. Trong một số tình huống bất thường, có thể hữu ích khi sử dụng các số dấu phẩy động với độ chính xác cao hơn. Điều này có khả thi trong numpy hay không tùy thuộc vào phần cứng và môi trường phát triển. cụ thể, các máy x86 cung cấp dấu phẩy động phần cứng với độ chính xác 80 bit và trong khi hầu hết các trình biên dịch C cung cấp điều này dưới dạng loại
>>> z.dtype dtype['uint8']7 của chúng, thì MSVC [tiêu chuẩn cho các bản dựng Windows] làm cho
>>> z.dtype dtype['uint8']7 giống với
>>> z.dtype dtype['uint8']5 [64 bit]. NumPy làm cho
>>> z.dtype dtype['uint8']7 của trình biên dịch có sẵn dưới dạng
>>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+2005 [và
>>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+2006 cho các số phức]. Bạn có thể tìm hiểu những gì numpy của bạn cung cấp với
>>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+2007
NumPy không cung cấp một dtype với độ chính xác cao hơn
>>> z.dtype dtype['uint8']7 của C;
Để căn chỉnh bộ nhớ hiệu quả,
>>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+2005 thường được lưu trữ đệm bằng 0 bit, hoặc là 96 hoặc 128 bit. Cái nào hiệu quả hơn phụ thuộc vào phần cứng và môi trường phát triển; .
>>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+2005 được đệm theo mặc định của hệ thống; . Bất chấp tên gọi,
numpy.bool_
2 và numpy.bool_
3 chỉ cung cấp độ chính xác tương đương với >>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+2005, tức là 80 bit trên hầu hết các máy x86 và 64 bit trong các bản dựng Windows tiêu chuẩn
Được cảnh báo rằng ngay cả khi
>>> np.power[100, 100, dtype=np.int64] # Incorrect even with 64-bit int 0 >>> np.power[100, 100, dtype=np.float64] 1e+2005 cung cấp độ chính xác cao hơn python
>>> z.dtype dtype['uint8']3, thì rất dễ mất đi độ chính xác bổ sung đó, vì python thường buộc các giá trị phải chuyển qua
>>> z.dtype dtype['uint8']3. Ví dụ: toán tử định dạng
bool
0 yêu cầu các đối số của nó phải được chuyển đổi thành các loại python tiêu chuẩn và do đó không thể duy trì độ chính xác mở rộng ngay cả khi yêu cầu nhiều chữ số thập phân. Có thể hữu ích khi kiểm tra mã của bạn với giá trị bool
1