文章目录
基本介绍
NumPy(Numerical Python)
- 快速高效的多维数组对象ndarray
- 用于对数组执行 元素级计算 以及直接对数组执行 数学计算 的函数
- 用于读写硬盘上基于数组的数据集的工具
- 线性代数运算、傅里叶变换,以及随机数生成
- 用于将C、C++、Fortran代码集成到Python的工具
对于数值型数据,NumPy数组在存储和处理数据时要比内置的Python数据结构高效得多。此外,由低级语言(比如C和Fortran)编写的库可以直接操作NumPy数组中的数据,无需进行任何数据复制工作。
一、Numpy数据类型
ndarray的创建和变换
- ndarray创建
# 创建ndarray
np.array(d1)
np.array([1,2,3], dtype = np.float64)
np.asarray() # 将输入转换为ndarray,如果本身是ndarray则不进行转换
np.arange(n)
np.ones(shape); np.ones_like(a) # ones_like以另一个数组为参数,根据其形状和dtype创建一个全1数组
np.zeros(shape); np.zeros_like(a) # zero_like以另一个数组为参数,根据其形状和dtype创建一个全0数组
np.empty(shape); np.empty_like(a) # 创建新数组,只分配内存空间但不填充任何值
np.full(shape, val); np.full_like(a, val)
np.eye(n); np.identity() # 创建一个正方的NxN的单位矩阵,(对角线为1,其余为0)
- 属性的转换
.ndim, .shape, .size, .dtype, .itemsize
.reshape(shape)
.resize(shape)
.swapaxes(ax1, ax2)
.flatten()
- 将ndarray转换为列表
列表 是 Python中 最基础的一种类型,运算速度是没有ndarray快的,但是有时候需要与原生的python程序结合,需要转换成list
arr.tolist()
基础数据类型
类型 | 类型代码 | 说明 |
---|---|---|
int8, uint8 | i1,u1 | 有符号和无符号的8位(1个字节)整型 |
int 16, uint16 | i2, u2 | 有符号和无符号的16位(2个字节)整型 |
int32, uint32 | i4,u4 | 有符号和无符号的32位(4个字节)整型 |
int64, uint64 | i8, u8 | 有符号和无符号的64位(8个字节)整型 |
float16 | f2 | 半精度浮点数 |
float32 | f4或f | 标准的单精度浮点数,与C的float兼容 |
float64 | f8或d | 标准的双精度浮点数,与C的double和Python的float对象兼容 |
float128 | f16或g | 扩展精度浮点数 |
complex64, complex128, complex256 | c8、c16、c32 | 分别用32位、64位或128位浮点数表示的复数 |
bool | ? | 存储True和False值的布尔类型 |
object | O | Python对象类型 |
string_ | S | 固定长度的字符串类型(每个字符1个字节)。例如,哟啊创建一个长度为10的字符串,应使用S10 |
unicode_ | U | 固定长度的unicode类型(字节数由平台决定),跟字符串的定义方法一样(如U10) |
- 可以在创建numpy的时候显式地指定数据类型
arr1 = np.array([1,2,3], dtype=np.float64)
arr2 = np.array([1,2,3], dtype=np.int32)
arr1.dtype
arr2.dtype
- 可以通过 ndarray 的 astype 方法,显式地 转换其 dtype
使用astype一定会创建出一个新的数组(原数组的一个拷贝),即使新的dtype跟老的相同
arr2 = arr1.astype(np.float64)
- 或者可以用一个arr1的数据类型,去定义 另一个arr2
arr2.astype(arr1.dtype) ---> astype 会创建出一个新的数据(原始数据的一份拷贝)
广播运算介绍 broadcasting
数组很重要,因为它使你不用编写循环即可对数据执行批量运算
,这通常就叫作矢量化(vectorization)。
-
一般来说,矢量化的方法要比纯Python方式快上一两个数量级。(尤其是各种数值计算)
-
数据与标量、相同shape的数组之间的任何算数运算,都是
元素级的运算
-
shape不同的数组之间的运算 叫
广播(broadcasting)
数组的切片和索引
- ndarray 的索引和切片
与列表最重要的区别在于,数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到原数组上。
由于NumPy的设计目的是处理大数据,所以你可以想象一下,如果NumPy坚持要将数据复制来复制去的话会产生何等的性能和内存问题。
如果你需要得到的是ndarray切片的一份副本而非视图,就需要显式地进行复制操作,例如arr[5:8].copy()
- 对 嵌套数组 的 索引
arr2[0][2] 等价于 arr2[0, 2]
- 布尔型索引
布尔型数组的长度必须跟被索引的轴的长度一致。
布尔型索引的数组本身由判断产生,判断条件可以用&(和)、|(或)之类的布尔算数运算符。
通过布尔型索引选取数组中的数据,将总是创建数据副本,即使返回一模一样的数组也是如此。
data[name == 'Bob']
data[(name == 'Bob') | (name