# 7.2 NumPy数组

### 7.2.1 NumPy 数值类型

NumPy支持的数值类型比Python多得多。本节展示哪些可用，以及如何修改数组的数据类型。

所支持的基本类型与C语言中的基本类型紧密相连:

| **NumPy类型**              | **C语言类型**           | **描述**                                                                                           |
| ------------------------ | ------------------- | ------------------------------------------------------------------------------------------------ |
| _np.bool_                | bool                | Boolean (True or False) stored as a byte                                                         |
| _np.byte_                | signed char         | Platform-defined                                                                                 |
| _np.ubyte_               | unsigned char       | Platform-defined                                                                                 |
| _np.short_               | short               | Platform-defined                                                                                 |
| _np.ushort_              | unsigned short      | Platform-defined                                                                                 |
| _np.intc_                | int                 | Platform-defined                                                                                 |
| _np.uintc_               | unsigned int        | Platform-defined                                                                                 |
| _np.int\__               | long                | Platform-defined                                                                                 |
| _np.uint_                | unsigned long       | Platform-defined                                                                                 |
| _np.longlong_            | long long           | Platform-defined                                                                                 |
| _np.ulonglong_           | unsigned long long  | Platform-defined                                                                                 |
| _np.half_ / _np.float16_ |                     | Half precision float: sign bit, 5 bits exponent, 10 bits mantissa                                |
| _np.single_              | float               | Platform-defined single precision float: typically sign bit, 8 bits exponent, 23 bits mantissa   |
| _np.double_              | double              | Platform-defined double precision float: typically sign bit, 11 bits exponent, 52 bits mantissa. |
| _np.longdouble_          | long double         | Platform-defined extended-precision float                                                        |
| _np.csingle_             | float complex       | Complex number, represented by two single-precision floats (real and imaginary components)       |
| _np.cdouble_             | double complex      | Complex number, represented by two double-precision floats (real and imaginary components).      |
| _np.clongdouble_         | long double complex | Complex number, represented by two extended-precision floats (real and imaginary components).    |

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

| **NumPy类型**                      | **C type**     | **Description**                                                                  |
| -------------------------------- | -------------- | -------------------------------------------------------------------------------- |
| _np.int8_                        | int8\_t        | Byte (-128 to 127)                                                               |
| _np.int16_                       | int16\_t       | Integer (-32768 to 32767)                                                        |
| _np.int32_                       | int32\_t       | Integer (-2147483648 to 2147483647)                                              |
| _np.int64_                       | int64\_t       | Integer (-9223372036854775808 to 9223372036854775807)                            |
| _np.uint8_                       | uint8\_t       | Unsigned integer (0 to 255)                                                      |
| _np.uint16_                      | uint16\_t      | Unsigned integer (0 to 65535)                                                    |
| _np.uint32_                      | uint32\_t      | Unsigned integer (0 to 4294967295)                                               |
| _np.uint64_                      | uint64\_t      | Unsigned integer (0 to 18446744073709551615)                                     |
| _np.intp_                        | intptr\_t      | Integer used for indexing, typically the same as ssize\_t                        |
| _np.uintp_                       | uintptr\_t     | Integer large enough to hold a pointer                                           |
| _np.float32_                     | float          |                                                                                  |
| _np.float64_ / _np.float\__      | double         | Note that this matches the precision of the builtin python _float_.              |
| _np.complex64_                   | float complex  | Complex number, represented by two 32-bit floats (real and imaginary components) |
| _np.complex128_ / _np.complex\__ | double complex | Note that this matches the precision of the builtin python _complex_.            |

有5种基本的数值类型表示布尔值(bool)、整数(int)、无符号整数(uint)浮点数(float)和复数。这些数值对象类型中，有5种最基本的数值类型，分别是布尔(bool)、整数(int)、无符号整数(uint)、浮点数(float)和复数。

NumPy中的数据类型名称也是数据类型的构造函数的名称:

\[]:x\_1=np.int(1)

x\_2=np.float32(\[1.0, 2.17, 3.14])

x\_1, x\_2

\[]:(1, array(\[1. , 2.17, 3.14], dtype=float32))

可以使用arange函数来创建整数列:

\[]:x\_3=np.arange(4, dtype=np.uint8)

x\_3

\[]:array(\[0, 1, 2, 3], dtype=uint8)

dtype为创建的数值类型。

可以使用. .astype()方法或类型本身作为函数来对数组类型进行转换：

\[]:x\_3.astype(float) #将整型数组x\_3转换为浮点数组x3

\[]:array(\[0., 1., 2., 3.])

要确定数组的类型，可以查看dtype属性:

\>>> z.dtype

dtype('uint8')

NumPy包含几个常量：

| NumPy类型     | 描述                                    |
| ----------- | ------------------------------------- |
| numpy.Inf   | 浮点数(正)无穷大的表示                          |
| numpy.NINF  | 浮点数负无穷大的表示                            |
| numpy.NAN   | 非数字表示                                 |
| numpy.NZERO | 负0的浮点数表示                              |
| numpy.e     | 欧拉常数，e2.71828182                      |
| numpy.pi    | 派，pi = 3.1415926535897932384626433... |

NumPy使用IEEE二进制浮点运算标准(IEEE 754)。这意味着没有一个数不等于无穷大。正无穷不等于负无穷。但是无穷大等于正无穷大。

电气电子工程师学会（IEEE）的英文全称是the Institute of Electrical and Electronics Engineers，其前身是成立于1884年的美国电气工程师协会(AIEE)和成立于1912年的无线电工程师协会(IRE)。前者主要致力于有线通讯、光学以及动力系统的研究，而后者则是国际无线电领域不断扩大的产物。20世纪30年代，“电子学”这个词开始进入工程学词典。虽然许多工程师都同时是AIEE和IRE两个协会的会员，但是新入行的电子工程师们还是更倾向于加入无线电工程师协会。两个协会之间激烈的竞争的结果，造就了双方的合作与合并。1963年，AIEE和IRE宣布合并，电气电子工程师学会（IEEE）正式成立了。

作为全球最大的专业技术组织，在电气及电子工程、计算机、通信等领域中，IEEE 发表的技术文献占到了全球同类文献的百分之三十。同时IEEE每年还结集出版电气工程、通讯、计算机理论及方法领域的专业技术期刊，数量达140余册。配合各专业技术领域的学术交流活动，IEEE还提供学报、技术通讯、会议论文集和会刊等约700余种出版物。

如今，随着电子信息和其他相关技术的不断发展和演进，以及会员职业范围的扩大和技术兴趣的不断增长，IEEE也将其关注点不断扩充至其他新兴领域。IEEE将努力帮助其会员跟上并引领新技术发展步伐，制定国际和行业标准，并激励新一代专业技术人员架构并融入全球技术协作团队。更重要的是，随着会员所在地域范围的扩大，IEEE已经日趋全球化，并通过其会员的全球化，在航空航天、生物科技、计算机工程、新能源、地理信息系统、神经网络、无线通信等高科技领域的技术发展上走在了前沿。

### 7.2.2 ndarray类型

NumPy中核心数据对象类型是ndarray类型，也就是N-维数组对象。可以使用array()函数来创建ndarray对象：

\[]: x = np.array(\[\[1, 2, 3], \[4, 5, 6], \[7, 8, 9]])

x

\[]:array(\[\[1, 2, 3],

\[4, 5, 6],

\[7, 8, 9]])

使用ndarray的shape属性查看数组的形状

\[]:x.shape

(3, 3)

若想创建特定数据类型的ndarray对象，可以将对象类型传入构造函数:

\[]:x=np.array(\[\[1, 2, 3], \[4, 5, 6], \[7, 8, 9]], np.float)

x

\[]:array(\[\[1., 2., 3.],

\[4., 5., 6.],

\[7., 8., 9.]])

使用type()函数产看x的类型:

\[]:type(x)

\[]:numpy.ndarray

除了使用array函数来创建，也可以使用更底层的ndarray()构造函数来创建由固定大小的项组成的多维齐次数组。

\[]:np.ndarray(shape=(4, 3), dtype=float)

\[]:array(\[\[1.047e-321, 0.000e+000, 0.000e+000],

\[0.000e+000, 0.000e+000, 0.000e+000],

\[0.000e+000, 0.000e+000, 0.000e+000],

\[0.000e+000, 0.000e+000, 0.000e+000]])
