第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='
第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
*itemsize
a.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
一个可迭代的对象 # 对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.]])