第1章 Numpy数组对象
-
Numpy中的多维数组称为ndarray,是Numpy中最常见的数组对象 -
ndarray对象包括:1)数据本身;2)描述数据的元数据 -
Numpy数组的优势
- 由相同种类的元素组成,即数组中的数据项的类型一致;
- 能够运用向量化运算来处理整个数组,速度较快;
- 使用了优化过的
C API,运算速度较快;
第2章 创建ndarray数组
导入
numpy库时通常简写为np,这也是Numpy官方倡导的写法
import numpy as np常见创建方法
- 基于
list或tuple一维数组 arr_list = np.array([1, 2, 3, 4]) arr_list -- > array([1, 2, 3, 4]) print(arr_list) [1 2 3 4] 一维数组用print输出的时候为 [1 2 3 4],与python的列表list有差异,没有“ , ” 二维数组 arr = np.array([[1, 2, 3], [4, 5, 6]]) 创建二维数组时,子list外面还有一个”[ ]”,形式为“[ [list1], [list2] ]” arr array([[1, 2, 3], [4, 5, 6]]) print(arr) [[1 2 3] [4 5 6]] - 基于
np.arange()一维数组 arr1 = np.arange(5) print(arr1) [0 1 2 3 4] 二维数组 arr2 = np.array([np.arange(3), np.arange(4)]) print(arr2) [array([0, 1, 2]) array([0, 1, 2, 3])] - 基于
np.arange.reshape()三维数组 arr3 = np.arange(24).reshape(3, 2, 4) arange的长度要与ndarray的维度乘积相等,本例中 24 = 2X3X4 print(arr3) [[[ 0 1 2 3] [ 4 5 6 7]] [[ 8 9 10 11] [12 13 14 15]] [[16 17 18 19] [20 21 22 23]]] - 其它方法:
zeros()、ones()、full()、eye()、random.random()、random.randint()、random.choice()创建元素均为0的数组 np.zeros((2, 3)) array([[ 0., 0., 0.], [ 0., 0., 0.]]) 创建元素均为1的数组 np.ones((2, 4)) array([[ 1., 1., 1., 1.], [ 1., 1., 1., 1.]]) 创建元素均为指定值的数据:可以实现zeros()和ones()的功能 np.full((2, 3), 100) array([[100, 100, 100], [100, 100, 100]]) 创建单位数组:左上角到右下角的折线上元素均为1 np.eye(3) array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]]) 创建0-1之间随机数字组成的数组 np.random.random((3, 4)) array([[ 0.44678911, 0.32013646, 0.79493587, 0.42866371], [ 0.93831111, 0.27245856, 0.85071582, 0.92076269], [ 0.43796771, 0.8913745 , 0.56834941, 0.60390724]]) 创建指定整数范围之间随机数字组成的数组 np.random.randint(10, 20, [2, 3]) array([[11, 12, 19], [19, 12, 10]]) 创建指定列表中随机选择元素组成的数组 np.random.choice(['yes', 'no', 'None'], [3, 4]) array([['no', 'yes', 'yes', 'yes'], ['no', 'no', 'None', 'no'], ['None', 'yes', 'None', 'yes']], dtype='<U4')
第3章 数据类型
- 数据类型
| 数据类型 | 说明 |
|---|---|
| bool | 布尔类型,True或Fasle,占用1比特 |
| inti | 其长度取决于平台的整数,一般是int32或int64 |
| int8 | 字节长度的整数,取值:[-128, 127] |
| int16 | 16位长度的整数,取值:[-32768, 32767] |
| int32 | 32位长度的整数,取值:[-2^31, 2^31 - 1] |
| int64 | 64位长度的整数,取值:[-2^63, 2^63 - 1] |
| uint8 | 8位无符号整数,取值:[0, 255] |
| uint16 | 16位无符号整数,取值:[0, 65535] |
| uint32 | 32位无符号整数,取值:[0, 2^32 - 1] |
| uint64 | 64位无符号整数,取值:[0, 2^64 - 1] |
| float16 | 16位半精度浮点数:1位符号,5位指数,10位尾数 |
| float32 | 32位半精度浮点数:1位符号,8位指数,23位尾数 |
| float或float64 | 双精度浮点数:1位符号,11位指数,52位尾数 |
| complex64 | 复数类型,实部和虚部都是32位浮点数 |
| complex或complex128 | 复数类型,实部和虚部都是64位浮点数 |
- 数据类型转换示例
np.int8(12.34) -- > 12 np.float(Fasle) -- > 0.0 - 在创建ndarray数组时,可以指定数值类型
np.arange(4, dtype=float) -- > array([ 0., 1., 2., 3.])
第4章 数组属性
-
dtype:设置数组的数据类型np.arange(3, dtype='D') 'D'表示复数类型 -- > np.arange(3, dtype='D') -
ndim:数组维度的数量a = np.array([[1, 2, 3], [4, 5, 6]]) a.ndim -- > 2 -
shape:数组对象的尺度,即矩阵的n行m列,是一个元组tuplea.shape -- > (2, 3) -
size:元素数量,即shape中n*m的值a.size -- > 6 -
itemsize:数组中单个元素所占用的字节数大小a.itemsize -- > 8 -
nbytes:数组的字节数量,即size*itemsizea.nbytes -- > 48 -
T:数组转置a.T array([[1, 4], [2, 5], [3, 6]]) -
real和imag:返回复数的实部和虚部a = np.array([1.2 + 2j, 2 + 3j]) print(a) [ 1.2+2.j 2.0+3.j] a.real -- > array([ 1.2, 2. ]) a.imag -- > array([ 2., 3.]) -
flat:返回一个numpy.flatiter可迭代对象,通过位置可以进行索引和赋值a = np.arange(6).reshape(2, 3) print(a) [[0 1 2] [3 4 5]] a.flat <numpy.flatiter at 0x7f937b910800> 一个可迭代的对象 # 对a.flat进行遍历 for i in a.flat: print(i, "a中第",i,"位是:", a.flat[i]) 0 a中第 0 位是: 0 1 a中第 1 位是: 1 2 a中第 2 位是: 2 3 a中第 3 位是: 3 4 a中第 4 位是: 4 5 a中第 5 位是: 5 a.flat[3] = 100 #赋值 print(a) [[ 0 1 2] [100 4 5]]
第5章 数组索引
- 一维数组
a = np.arange(7) a -- > array([0, 1, 2, 3, 4, 5, 6]) a[:6:2] #与python的list索引类似 array([0, 2, 4]) - 二维数组:先指定行的索引,再指定列的索引
a = np.arange(24).reshape(4, 6) a array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]]) a[1:3, 2:4] array([[ 8, 9], [14, 15]]) - 常用操作:
数据筛选、元素运算筛选大于15小于20的元素 a[(a > 15) & (a < 20)] array([16, 17, 18, 19]) 对数组a的第2列加100 a[0:, 1] += 100 等同于 a[np.arange(4), 1] += 100 a array([[ 0, 101, 2, 3, 4, 5], [ 6, 107, 8, 9, 10, 11], [ 12, 113, 14, 15, 16, 17], [ 18, 119, 20, 21, 22, 23]])
第6章 数组形状转换
- 行列转换:
reshape(n, m)和resize(n, m)a = np.arange(12).reshape(3, 4) a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) reshape()不会修改原数组,返回一个修改后的新数组对象 a.reshape(4, 3) array([[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8], [ 9, 10, 11]]) resize()会对原数组进行修改,返回None a.resize(2, 6) a array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]]) - 设置数组形状:
shape()a.shape = (3, 4) a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) - 多维转一维:
ravel()和flatten()a.ravel() array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) a.flatten() array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) 区别:通过该方式对数组赋值时,ravel()返回的是view,会改变原数组,flatten()会生成新对象,原数组不变。 a.ravel()[3] = 100 a array([[ 0, 1, 2, 100], 原数组的第3位数据已变成100 [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) a.flatten()[3] = 1000 a array([[ 0, 1, 2, 100], 原数组的第3位数据 未 变成 1000 [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) - 转置:
transpose()a.transpose() #作用同于T属性 array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [100, 7, 11]])
第7章 数组堆叠
- 水平堆叠:
hstack()和columns_stack()a = np.arange(6).reshape(2,3) a array([[0, 1, 2], [3, 4, 5]]) np.hstack((a, a*100)) array([[ 0, 1, 2, 0, 100, 200], [ 3, 4, 5, 300, 400, 500]]) np.column_stack((a, a*0)) array([[0, 1, 2, 0, 0, 0], [3, 4, 5, 0, 0, 0]]) - 垂直堆叠:
vstack()和row_stack()np.vstack((a, a*100)) array([[ 0, 1, 2], [ 3, 4, 5], [ 0, 100, 200], [300, 400, 500]]) np.row_stack((a, a*0)) array([[0, 1, 2], [3, 4, 5], [0, 0, 0], [0, 0, 0]]) - 指定方向叠加:
concatenate()np.concatenate((a, a*-1), axis=0) array([[ 0, 1, 2], [ 3, 4, 5], [ 0, -1, -2], [-3, -4, -5]]) np.concatenate((a, a*-1), axis=1) array([[ 0, 1, 2, 0, -1, -2], [ 3, 4, 5, -3, -4, -5]]) - 深度叠加:
dstack()# 叠加的2个数组,必须有相同的行列数 a = np.arange(9).reshape(3, 3) a array([[0, 1, 2], [3, 4, 5], [6, 7, 8]]) b = a * -1 b array([[ 0, -1, -2], [-3, -4, -5], [-6, -7, -8]]) np.dstack((a, b)) array([[[ 0, 0], [ 1, -1], [ 2, -2]], [[ 3, -3], [ 4, -4], [ 5, -5]], [[ 6, -6], [ 7, -7], [ 8, -8]]])
第8章 数组拆分
- 横行拆分:
hsplit()拆分的份数必须是数组列数的约数 a = np.arange(12).reshape(2, 6) a array([[ 0, 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10, 11]]) np.hsplit(a, 3) [array([[0, 1], [6, 7]]), array([[2, 3], [8, 9]]), array([[ 4, 5], [10, 11]])] - 纵向拆分:
vsplit()拆分的份数必须是数组行数的约数 b = np.arange(12).reshape(6, 2) b array([[ 0, 1], [ 2, 3], [ 4, 5], [ 6, 7], [ 8, 9], [10, 11]]) np.vsplit(b, 2) [array([[0, 1], [2, 3], [4, 5]]), array([[ 6, 7], [ 8, 9], [10, 11]])] - 指定方向拆分:
split()np.split(a, 2, axis=1) [array([[0, 1, 2], [6, 7, 8]]), array([[ 3, 4, 5], [ 9, 10, 11]])] np.split(b, 3, axis=0) [array([[0, 1], [2, 3]]), array([[4, 5], [6, 7]]), array([[ 8, 9], [10, 11]])] - 深度拆分:
dsplit()print(a) array([[[ 0, 0], [ 1, -1], [ 2, -2], [ 3, -3]], [[ 4, -4], [ 5, -5], [ 6, -6], [ 7, -7]], [[ 8, -8], [ 9, -9], [ 10, -10], [ 11, -11]]]) np.dsplit(b, 2) [array([[[ 0], [ 1], [ 2], [ 3]], [[ 4], [ 5], [ 6], [ 7]], [[ 8], [ 9], [10], [11]]]), array([[[ 0], [ -1], [ -2], [ -3]], [[ -4], [ -5], [ -6], [ -7]], [[ -8], [ -9], [-10], [-11]]])]
第9章 数组运算
- 数学四则运算:
add()、subtract()、multiply()、divide()a = np.array([[1, 2],[3, 4]]) a array([[1, 2], [3, 4]]) b = np.array([[9, 6], [3, 7]]) b array([[9, 6], [3, 7]]) 加法 a + b 等同于 np.add(a, b) array([[10, 8], [ 6, 11]]) 减法 a - b 等同于 np.subtract(a, b) array([[-8, -4], [ 0, -3]]) 乘法 a * b 等同于 np.multiply(a, b) array([[ 9, 12], [ 9, 28]]) 除法 a / b 等同于 np.divide(a, b) array([[ 0.11111111, 0.33333333], [ 1. , 0.57142857]]) - 矩阵乘法:
第1个数组的列数必须与第2个数组的行数相同a = np.array([[1, 2],[3, 4]]) a array([[1, 2], [3, 4]]) b = np.array([[1, 2, 3], [3, 4, 5]]) b array([[1, 2, 3], [3, 4, 5]]) np.dot(a, b) array([[ 7, 10, 13], [15, 22, 29]]) - 常用统计函数
a = np.arange(12).reshape(3, 4) a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) 求(max - min) a.ptp(axis=0) array([8, 8, 8, 8]) 累加值 a.cumsum(axis=1) array([[ 0, 1, 3, 6], [ 4, 9, 15, 22], [ 8, 17, 27, 38]]) 其它运算:开方 np.sqrt(a) array([[ 1. , 1.41421356], [ 1.73205081, 2. ]])
| 函数 | 说明 |
|---|---|
len |
返回个数 |
| np.sum() | 返回求和 |
| np.mean() | 返回均值 |
| np.max() | 返回最大值 |
| np.min() | 返回最小值 |
| np.ptp() | 沿指定轴返回最大值减去最小值:即(max - min)
|
| np.std() | 返回标准偏差 |
| np.var() | 返回方差 |
| np.cumsum() | 返回累加值 |
| np.cumprod() | 返回累乘积值 |
- 数组广播
- 当数组与一个标量进行数学运算
(加减乘除)时,标量会根据数组的形状进行扩展,然后执行运算,这个扩展的过程称为广播(broadcasting)a = np.arange(12).reshape(3, 4) a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) a + 10000 array([[10000, 10001, 10002, 10003], [10004, 10005, 10006, 10007], [10008, 10009, 10010, 10011]]) - 数组与一维数组的运算也可以进行
广播,前提是数组的列数与一维数组的元素个数相同b = np.array([2, 10, 4, 8]) b array([ 2, 10, 4, 8]) a + b array([[ 2, 11, 6, 11], [ 6, 15, 10, 15], [10, 19, 14, 19]]) 使用tile()函数也可以实现该运算:将b在纵轴上重复3次,即和数组a的行数相同,即可直接进行数学加运算 a + np.tile(b, (3, 1)) array([[ 2, 11, 6, 11], [ 6, 15, 10, 15], [10, 19, 14, 19]])
第10章 数组函数
- 生成指定范围内的随机数值:
uniform()np.random.uniform(50, 70) -- > 55.1791859753946 - 将数组作为一个元素,在指定方向上重复n次:
tile()a = np.array([[1,10], [2, 200]]) a array([[ 1, 10], [ 2, 200]]) 数组a,在纵轴上重复0次、在横轴上重复2次 np.tile(a, (1, 3)) array([[ 1, 10, 1, 10, 1, 10], [ 2, 200, 2, 200, 2, 200]]) - 数组元素在指定轴上(默认为横轴)排序的序号:
argsort()a = np.array([[5, 3, 7, 1], [2, 1, 3, 9], [8, 5, 3, 6]]) a array([[5, 3, 7, 1], [2, 1, 3, 9], [8, 5, 3, 6]]) 横轴排序 array([[3, 1, 0, 2], [1, 0, 2, 3], [2, 1, 3, 0]]) 纵轴排序 a.argsort(axis=1) array([[3, 1, 0, 2], [1, 0, 2, 3], [2, 1, 3, 0]]) - 数组转成list:
tolist()a = np.arange(12).reshape(3, 4) a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) a.tolist() [[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]] - 数组数据类型转换:
astype()a.astype(float) array([[ 0., 1., 2., 3.], [ 4., 5., 6., 7.], [ 8., 9., 10., 11.]])