一、Numpy概述
1、Numerical Python,数值的Python,补充了Python语言所欠缺的数值计算能力。
2、Numpy是其它数据分析及机器学习库的底层库。
3、Numpy完全标准C语言实现,运行效率充分优化。
4、Numpy开源免费。
二、Numpy历史
1、1995年,Numeric,Python语言数值计算扩充。
2、2001年,Scipy-->Numarray,多维数组运算。
3、2005年,Numeric+Numarray-->Numpy。
4、2006年,Numpy脱离了Scipy成为独立的项目。
三、Numpy的核心:多维数组(与list对比)
1、代码简洁:减少Python代码的循环
如何使用循环生成二维、三维list?
2、底层实现:厚内核(C)+薄接口(Python),保证性能。
四、Numpy介绍
Numpy提供了两种基本对象:
Ndarray:多维数组对象。----单类型(一种类型),
Ufunc:能够对数组进行处理的函数。
五、numpy的安装
(1)cmd安装:python –m pip install numpy –i 网址
(2)pycharm中安装
六、numpy基本操作
6.1.数组对象ndarray
数组的基本属性:
ndim | 返回int,数组的维度 |
shape | 返回tuple,数组形状 |
size | 返回int,表示数组元素总数 |
dtype | 返回data-type,数据元素类型 |
itemsize | 返回int,每个元素的存储空间字节 |
创建数组对象函数:
(1)array函数
numpy.array(object,dtype=None,*,copy=True,order='K',subok=False, ndmin=0,like=None)
object | 所需创建的数组对象 |
dtype | 数组数据类型 |
ndmin | 接收int数组的维度 |
案例1:创建普通数组,指定数据类型:
import numpy as np #导入numpy库
arr1 = np.array([1,2,3,4]) #创建一维数组
arr2 = np.array([[1,2,3,4],[4,5,6,7],[7,8,9,10]]) #创建二维数组
print(arr2.shape) #查看数组形状
print(arr2.dtype) #查看数组元素类型
print(arr2.size) #查看数组元素个数
print(arr2.itemsize) #查看数组每个元素存储空间
t1 = np.array(range(1,4),dtype='int8') # 指定numpy中创建的数组的数据类型
print(t1) # 输出结果:[1 2 3]
print(t1.dtype) # 输出结果:int8
t2 = np.array([1,0,1,1,0,1],dtype=’str_’) # numpy 中的bool 类型
print(t2) # 输出结果: [ '1' '0' '1' '1' '0' '1']
print(t2.dtype) # 输出结果:<U1
t3 = np.array([1,0,1,1,0,1],dtype=’bool’)
print(t3) # 输出结果: [ True False True True False True]
print(t3.dtype) # 输出结果:bool
t4 = np.array(['2023-02-22','2021-02-22'],dtype=’datetime64’)
# t4 = np.datetime64('2023-02-22')
print(t4) #输出结果:['2023-02-22' '2021-02-22']
案例2:自定义复合数据类型数组
#data包括姓名name,成绩score,年龄age
import numpy as np
data=[
('张三', [90, 80, 85], 15),
('李四', [92, 81, 83], 16),
('王五', [95, 85, 95], 15)
]
#第一种方式
a = np.array(data,dtype='U3,3int32,int32')
print(a[0]['f0'], ":", a[0]['f1'])
#第二种方式
b = np.array(data, dtype=[('name', 'str_', 3),
('scores', 'int32', 3),
('ages', 'int32', 1)])
print(b[0]['name'], ":", b[0]['scores'])
print(b[1]['name'], ":", b[1]['scores'])
#第三种方式
c = np.array(data, dtype={'names': ['name', 'scores', 'ages'],
'formats': ['U3', '3i4', 'int32']})
print(c[0]['name'], ":", c[0]['scores'], ":", c.itemsize)
案例3:修改数组类型
n1 = np.array(range(1,4))
print(n1)
#astype变换数组类型需要存放新对象中
n2 = n1.astype(dtype=np.float32)
print(n2)
print(n2.dtype,n1.dtype)
(2)arange函数
用于创建一维数组,不包括stop值。
numpy.arrage([start,]stop[,step], dtype=None)
start | 数组的开始值 |
stop | 数组的终值 |
step | 值之间的步长 |
dtype | 输出数组的类型 |
案例:
import numpy as np
arr1 = np.arange(0,1,0.1)
print(arr1)
(3)zeros/ones函数
zeros函数用于创建元素全部为0的数组,即将创建的数组的元素全部填充为0;
ones函数用于创建元素全部为1的数组,即将创建的数组的元素全部填充为1;
numpy.zeros(4)或zeros((3,3)),可将zeros换成ones函数。
import numpy as np
arr1 = np.zeros((3,3))
print(arr1)
arr2 = np.ones((3,3))
print(arr2)
(4)eye函数
eye函数用于生成主对角线上的元素为1,其它元素为0的二维数组(类似单位矩阵)
import numpy as np
arr1 = np.eye((3))
print(arr1)
(5)diag函数
用于创建指定对角线上的元素,其它元素为0.(类似对角矩阵),即除对角线上的元素以外的其他元素都为0,对角线上的元素可以是0或者其他值;
import numpy as np
arr1 = np.diag([1,2,3,4])
print(arr1)
(6)linspace函数
指定开始,终值和元素个数创建一维等差数组,包含终值。
start | 起始站 |
stop | 终值 |
num | 生成的样本数 |
dtype | 输出数组的类型 |
import numpy as np
arr1 = np.linspace(0,1,12)
print(arr1)
(7)logspace函数
指定开始,终值和元素个数创建一维等比数组,包含终值。
默认创建数值为10的幂,如果需要改变,可通过base参数设置。
import numpy as np
arr1 = np.logspace(0,2,20)
print(arr1)
6.2.生机随机数
(1) np.random.random(size=()) #size可为元组,可以是一、二、三维,产生值:0-1浮点数
(2) np.random.rand(d0,d1…) #d0,d1….接收int,表示数组维度,产生均匀分布随机数
(3) np.random.randn(d0,d1…) #与 rand函数类似,产生服从正态分布随机数
(4)np.random.randint(low,high,size,dtype) #产生从low到high之间size个元素,size可以是一个元组,指定维度,dtype指定数组类型
(5) np.random.uniform(-1, 5, size = (3, 4)) #可以指定区间(-1, 5), size用于指定维度
(6)其它常用随机数函数
seed | 确定随机数生成器的种子 |
permutation | 返回一个序列的随机排列或者返回一个随机排列的范围 |
shuffle | 对一个序列进行随机排序 |
binomial | 产生服从二项分布的随机数 |
normal | 产生服从正态分布的随机数 |
beta | 产生服从beta分布的随机数 |
chisquare | 产生服从卡方分布的随机数 |
gamma | 产生服从gamma分布的随机数 |
uniform | 产生在[0.0,1.0]中均匀分布的随机数 |
6.3.数组的索引(start:0,end:n-1)
(1)一维: a[start:end:step] 正向反向都可
a[0:10:2] a [-1:-10:-2]
(2)二维: a[start:end,start:end]第一个冒号是行,第二个冒号是列,也可以单行单列罗列。
a[0:1,2:3] #第1、2行的第3、4列
6.4ndarray的其它操作
1、修改数组形状
(1) reshape:接收int或元组
n1 = np.array(range(1,19))
print(n1)
n2 = n1.reshape(2,9)
print(n2)
print(n2.reshape(2,3,3))
print(n2.reshape((1,))) #语句出错,只能向高维度转换
(2)ravel:完成数组展平工作
n1 = np.array(range(1,19))
print(n1)
n2 = n1.reshape(2,9)
n3 = n2.reshape(2,3,3)
print(n3.ravel())
(3) flatten:可以选择横向或纵向展平数组
n1 = np.array(range(1,19))
n2 = n1.reshape(2,9)
n3 = n2.reshape(2,3,3)
print(n1,n2,n3,sep='\n')
print(n2.flatten('F')) #纵向展平
print(n2.flatten('C')) #横向展平,C可省略
print(n3.flatten('F')) #纵向展平
print(n3.flatten('C')) #横向展平,C可省略
2、数组切片(通过索引实现数组元素的获取)0。。。。。n-1,-1。。。。。。-n
(1) 一维数组切片
(2) 二维数组切片
(3) 三维数组切片
n1 = np.array(range(1,19))
n2 = n1.reshape(2,9)
n3 = n2.reshape(2,3,3)
print(n1,n2,n3,sep='\n')
print(n1[::-1]) #反转一维数组
print(n2[::-1,::-1]) #反转二维数组
print(n3[::-1,::-1,::-1]) #反转三维数组
print(n1[2:19:3])# 打印n1中索引为2至19,步长值为3的数组元素
print(n1[:5])# 打印n1中索引为5以前的数组元素
print(n2[0,3:5])# 打印n2中第1行第4、5列的元素
print(n3[[0,1],1,...])# 打印n3中第2行所有元素
print(n3[[0,1],...,1])# 打印n3中第2列所有元素
3、组合数组
(1) concatenate函数:沿着指定轴连接相同形状的两个或多个数组,axis参数设置轴
(2) hstack函数:实现水平(横向)堆叠序列中的数组(列方向)
(3) vstack函数:实现垂直(纵向)堆叠序列中的数组(行方向)
n1 = np.array(range(1,19)).reshape(6,3)
n2 = np.arange(20,38,1).reshape(6,3)
print(n1,n2,sep='\n')
print(np.concatenate((n1,n2),axis=1)) #等同print(np.hstack((n1,n2)))
print(np.hstack((n1,n2)))
print(np.concatenate((n1,n2),axis=0)) #等同print(np.vstack((n1,n2)))
print(np.vstack((n1,n2)
4、分割数组
(1) split函数:沿着特定的轴将原数组分割为多个子数组, axis参数设置轴
(2) hsplit函数:将一个数组从水平方向分割为多个子数组
(3) vsplit函数:将一个数组从垂直方向分割为多个子数组
n1= np.arange(1,37,1).reshape(6,6)
print(n1)
#indices_or_sections用于设置分割的份数,设置一个整数表示平均分割,设置一个数组按指定索引位置分割
print(np.split(n1,indices_or_sections=3,axis=0)) #等同np.vsplit(n1,indices_or_sections=3)
print(np.vsplit(n1,indices_or_sections=3))
print(np.split(n1,indices_or_sections=3,axis=1)) #等同np.hsplit(n1,indices_or_sections=3)
print(np.hsplit(n1,indices_or_sections=3))
print(np.split(n1,indices_or_sections=[2,4,6]))