NumPy基础知识(一)

NumPy基础知识(一)

数组类型和类型之间的转换

NumPy比Python支持更多的数字类型。本节显示哪些可用,以及如何修改数组的数据类型。

支持的基本类型与C中的紧密相关:

Numpy型

C型

描述

np.bool_

bool

布尔值(True或False)存储为字节

np.byte

signed char

平台定义

np.ubyte

unsigned char

平台定义

np.short

short

平台定义

np.ushort

unsigned short

平台定义

np.intc

int

平台定义

np.uintc

unsigned int

平台定义

np.int_

long

平台定义

np.uint

unsigned long

平台定义

np.longlong

long long

平台定义

np.ulonglong

unsigned long long

平台定义

np.half / np.float16

 

半精度浮点数:符号位,5位指数,10位尾数

np.single

float

平台定义的单精度浮点数:通常为符号位,8位指数,23位尾数

np.double

double

平台定义的双精度浮点数:通常为符号位,11位指数,52位尾数。

np.longdouble

long double

平台定义的扩展精度浮点数

np.csingle

float complex

复数,由两个单精度浮点数表示(实部和虚部)

np.cdouble

double complex

复数,由两个双精度浮点数(实部和虚部)表示。

np.clongdouble

long double complex

复数,由两个扩展精度浮点数(实部和虚部)表示。

由于其中许多具有平台相关的定义,因此提供了一组固定大小的别名:

脾气暴躁型

C型

描述

np.int8

int8_t

字节(-128至127)

np.int16

int16_t

整数(-32768至32767)

np.int32

int32_t

整数(-2147483648至2147483647)

np.int64

int64_t

整数(-9223372036854775808至9223372036854775807)

np.uint8

uint8_t

无符号整数(0到255)

np.uint16

uint16_t

无符号整数(0到65535)

np.uint32

uint32_t

无符号整数(0到4294967295)

np.uint64

uint64_t

无符号整数(0至18446744073709551615)

np.intp

intptr_t

用于索引的整数,通常与 ssize_t

np.uintp

uintptr_t

足够大以容纳指针的整数

np.float32

float

 

np.float64 / np.float_

double

请注意,这与内置python float的精度匹配。

np.complex64

float complex

复数,由两个32位浮点数表示(实部和虚部)

np.complex128 / np.complex_

double complex

请注意,这与内置python complex的精度匹配。

NumPy数值类型是dtype(数据类型)对象的实例,每个对象都有独特的特征。导入NumPy后,请使用

>>>
>>> import numpy as np

在dtypes可作为np.bool_np.float32等等。

上表中未列出的高级类型在“结构化数组”部分中进行了探讨。

有5种基本的数值类型,分别代表布尔(布尔),整数(int),无符号整数(uint)浮点(float)和复数。名称中带有数字的数字表示该类型的位大小(即,需要多少位来表示内存中的单个值)。某些类型(例如int和 intp)具有不同的位大小,具体取决于平台(例如32位与64位计算机)。当与寻址原始内存的低级代码(例如C或Fortran)接口时,应考虑到这一点。

数据类型可以用作将python数字转换为数组标量的函数(有关说明,请参见数组标量部分),可以将python数字序列转换为该类型的数组,也可以用作许多numpy函数或方法接受的dtype关键字的参数。一些例子:

>>>

>>> import numpy as np
>>> 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)

数组类型也可以用字符代码来引用,主要是为了保持与诸如Numeric之类的较早软件包的向后兼容性。一些文档可能仍引用这些文档,例如:

>>>

>>> np.array([1, 2, 3], dtype='f')
array([ 1.,  2.,  3.], dtype=float32)

我们建议改为使用dtype对象。

要转换数组的类型,请使用.astype()方法(首选)或将类型本身用作函数。例如:

>>>

>>> z.astype(float)                 
array([  0.,  1.,  2.])
>>> np.int8(z)
array([0, 1, 2], dtype=int8)

请注意,上面我们将Python float对象用作dtype。NumPy的人都知道int是指np.int_bool手段np.bool_,那floatnp.float_complexnp.complex_。其他数据类型没有Python等效项。

要确定数组的类型,请查看dtype属性:

>>>

>>> z.dtype
dtype('uint8')

dtype对象还包含有关类型的信息,例如其位宽和字节顺序。数据类型也可以间接用于查询该类型的属性,例如是否为整数:

>>>

>>> d = np.dtype(int)
>>> d
dtype('int32')

>>> np.issubdtype(d, np.integer)
True

>>> np.issubdtype(d, np.floating)
False

数组标量

NumPy通常以数组标量(具有关联的dtype的标量)的形式返回数组的元素。数组标量与Python标量不同,但是它们在大多数情况下可以互换使用(主要的例外是v2.x之前的Python版本,其中整数数组标量不能用作列表和元组的索引)。有一些例外,例如,当代码需要标量的非常特定的属性时,或者当代码专门检查值是否为Python标量时。通常,存在的问题很容易被显式转换阵列标量到Python标量,采用相应的Python类型功能固定的(例如,intfloatcomplexstrunicode)。

使用数组标量的主要优点是它们保留了数组类型(Python可能没有可用的匹配标量类型,例如int16)。因此,使用数组标量可以确保数组和标量之间的行为相同,而不管该值是否在数组内部。NumPy标量也具有许多与数组相同的方法。

溢出错误

当值需要的数据量大于数据类型中可用的内存量时,NumPy数值类型的固定大小可能会导致溢出错误。例如, 正确numpy.power评估64位整数,但给出32749整数的1874919424(不正确)。100 * 10 ** 8

>>>

>>> np.power(100, 8, dtype=np.int64)
10000000000000000
>>> np.power(100, 8, dtype=np.int32)
1874919424

NumPy和Python整数类型的行为对于整数溢出有显着不同,并且可能会使期望NumPy整数的行为类似于Python的用户感到困惑int。与NumPy不同,Python的大小int很灵活。这意味着Python整数可以扩展以容纳任何整数,并且不会溢出。

NumPy提供numpy.iinfonumpy.finfo分别验证NumPy整数和浮点值的最小值或最大值

>>>

>>> 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)

如果64位整数仍然太小,则结果可能会强制转换为浮点数。浮点数提供了更大但不精确的可能值范围。

>>>

>>> np.power(100, 100, dtype=np.int64) # Incorrect even with 64-bit int
0
>>> np.power(100, 100, dtype=np.float64)
1e+200

扩展精度

Python的浮点数通常是64位浮点数,几乎等同于np.float64。在某些特殊情况下,使用精度更高的浮点数可能会很有用。是否可以在numpy中实现取决于硬件和开发环境:具体来说,x86机器提供具有80位精度的硬件浮点,而大多数C编译器将其作为类型提供 ,MSVC(Windows构建的标准)使得 等同于(64位)。NumPy使编译器可用于(以及 用于复数)。您可以找到numpy提供的功能。long doublelong doubledoublelong doublenp.longdoublenp.clongdoublenp.finfo(np.longdouble)

NumPy不提供比C精度更高的dtype ;特别是128位IEEE四精度数据类型(FORTRAN's )不可用。long doubleREAL*16

为了有效地进行内存对齐,np.longdouble通常使用零位填充存储到96或128位。哪个更有效取决于硬件和开发环境;通常在32位系统上,它们被填充为96位,而在64位系统上,它们通常被填充为128位。np.longdouble被填充为系统默认值;np.float96np.float128为需要特定填充的用户提供。尽管名字,np.float96并且 np.float128只有尽可能精确提供np.longdouble,即在标准的Windows上的大多数x86机器80位和64位版本。

请注意,即使np.longdouble提供比python更高的精度float,也容易失去这种额外的精度,因为python经常会强制值通过float。例如,%格式化操作符要求将其参数转换为标准python类型,因此即使请求了许多小数位,也无法保持扩展的精度。使用value测试代码可能很有用 。1 + np.finfo(np.longdouble).eps

  • 0
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

kimboyang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值