NumPy基础知识


一、NumPy是什么?

NumPy 是 Numerical Python 的缩写,它是一个由多维数组对象(ndarray)和处理这些数组的函数(function)集合组成的库。使用 NumPy 库,可以对数组执行数学运算和相关逻辑运算。NumPy 不仅作为 Python 的扩展包,它同样也是 Python 科学计算的基础包。
参考

二、常见函数/方法

1.ndarray属性

import numpy as np
# numpy.array(object->表示一个数组序列, dtype = None, copy = True, order = None,ndmin = 0)
# ndarray属性 dtype (np.uint8, np.int64, np.float32, np.float64...) 默认 int32 float64
score=np.array([[80,89,86,67,79],
                [78,97,89,67,81],
                [90,23,34,54,13],
                [23,54,67,34,64],
                [23,34,21,46,34],
                [52,32,54,64,23],
                [23,23,53,34,64],
                [34,65,34,67,36]])
score.shape 										# (8, 5)
score.ndim 											# 2
score.dtype 										# dtype('int32')
score.itemsize 										# 4,每个元素占4个Byte

2.生成数组

代码如下(示例):

np.zeros(shape,dtype=float,order="C")								
np.ones(shape, dtype = None, order = 'C')
np.empty(shape, dtype = float, order = 'C') 		# 返回的数组带有随机值,但这些数值并没有实际意义

np.arange(0,5,1) 									# 左闭右开,start=0,end,step=1
np.linspace(0,5,10) 								# 左右都包含 start,end,linspace

np.array()和np.asarray()都可以将结构数据(例如嵌套列表)转化为ndarray,
但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会.
data2=np.asarray(score) 							# 浅拷贝

data1=np.array(score) 								# 深拷贝
data3=np.copy(score) 								# 深拷贝

3.随机数组

  • 均匀分布
# 返回[0.0,1.0)内的一组均匀分布的数,dn表示每个维度
np.random.rand(d0,d1,,dn) 
# low默认为0,high默认为1,size输出样本数,为int或者tuple  均匀分布
np.random.uniform(low=0,high=1,size=None)
# high默认为 None,若只输入low的参数,返回[0,low)之间的数 若输入high的值,返回[low,high)之间的数 均匀分布
np.random.randint(low=0, high=None, size=None, dtype=’l’)
  • 正态分布
np.random.randn(d0,d1,,dn)							# 标准正态分布
np.random.normal(loc=0.0, scale=1.0, size=None) 	# loc 均值 	scale 标准差
  • 随机数种子
# 当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数
np.random.seed(n)									# 使得随机数据可预测,n为整数

4.切片索引和高级索引

4.1 切片操作返回的是数组视图(浅拷贝)

  • 通过冒号 : 来分割切片参数,分别是 start(起始索引)、stop(终止索引) 和 step(步长)
  • 切片还可以使用省略号“…”,如果在行位置使用省略号,那么返回值将包含所有行元素,反之,则包含所有列元素。

4.2 高级索引返回的是数组的副本(深拷贝)

x = np.array([[1,  2],  [3,  4],  [5,  6]])
y1 = x[[0,1,2],[0,1,0]]  							# 形如这样的,为高级索引
y2 = x[[0,1]]										# 嵌套列表里只有单个列表时,代表在第0维度上依次按索引取值(取行)

4.3 布尔数组索引,返回满足条件的值

5. 遍历数组

# NumPy提供了一个 nditer 迭代器对象,它可以配合 for 循环完成对数组元素的遍历
a = np.arange(0,60,5)
for x in np.nditer(a):
	print(x)
for x,y in np.nditer([a,b]): 						# 也可以同时迭代数组a和b

5. 改变形状和类型

data1.reshape(5,8) 									# 返回新的ndarray,不改变原始的ndarray
data1.resize(5,8) 									# 没有返回值,对原始的ndarray进行修改

np.transpose(arr, axes) 							# 用于对换多维数组arr的维度,axes为元组或者整数列表,按照该参数进行对换
ndarray.T 											# 行列互换,副本

ndarray.flatten(order='C')							# 返回一份一维数组副本
np.squeeze()										# 删除数组中维度为 1 的项
ndarray.astype(np.float64) 							# 不改变原ndarray

np.concatenate((a1, a2, ...), axis) 				# axis:沿着该参数指定的轴连接数组,默认为0
np.stack((a1, a2, ...), axis) 						# axis:沿着该参数指定的轴堆叠数组,默认为0,新数组会升高一个维度
# indices_or_sections:若是一个整数,代表用该整数平均切分,若是一个数组,则代表沿轴切分的位置(左开右闭)
np.split(ary, indices_or_sections, axis)

6.逻辑和其他运算


np.unique(data1)									# 用于删除数组中重复的元素,若是多维数组则以一维数组形式展开
np.all(mask) 										# np.all(bool) 只要有一个false,则返回false
np.any(mask) 										# np.any(bool) 只要有一个true,则返回true
np.where(mask,1,0) 									# bool型ndarray,True时的操作,False时的操作  三元运算符
np.logical_and(data1<50,data1<70) 					# 逻辑与

# np.min() np.max() np.median() mp.mean() np.std() np.var() 函数名或者方法都可
data1.max(axis=1) # 第1维度上求最大值

7.数学函数

# NumPy 中提供了用于弧度计算的的 sin()(正弦)、cos()(余弦)和 tan()(正切)三角函数
arr = np.array([90]) 
print(np.sin(arr * np.pi/180)) 
# NumPy 还提供了 arcsin,arcos 和 arctan 反三角函数
# 若要想验证反三角函数的结果,可以通过 numpy.degrees() 将弧度转换为角度来实现

np.around(a,decimals)   			# a代表要输入的数组;decimals:要舍入到的小数位数,它的默认值为0
np.floor()							# 对数组中的每个元素向下取整数
np.ceil()							# 对数组中的每个元素向上取整数

# NumPy 数组的“加减乘除”算术运算,分别对应 add()、subtract()、multiple()->等价于a*b,对应位置相乘 以及 divide() 函数,其他类似
np.power(a,b)						# 将a数组中的元素作为底数,把b数组中与a相对应的元素作幂,最后以数组形式返回两者的计算结果
np.mod(a,b)							# 返回两个数组相对应位置上元素相除后的余数

# 这两个函数用于计算数组沿指定轴的最小值与最大值,对于二维数组来说,axis=1 表示沿着水平方向,axis=0 表示沿着垂直方向。
np.amin() 和 np.amax() 				# axis不传参时,返回整个数组中最小值和最大值
np.median() 						# 用于计算 a 数组元素的中位数(中值)
np.mean()							# 该函数表示沿指定的轴,计算数组中元素的算术平均值
np.var() 							# 方差
# 若一组数据的标准差较大,说明大部分的数值和其平均值之间差异较大;若标准差较小,则代表这组数值比较接近平均值
np.std()							# 标准差是方差的算术平方根,用来描述一组数据平均值的分散程度

8.统计排序

np.sort(a, axis) 					# a:要排序的数组;axis:沿着指定轴进行排序,如果没有指定 axis,默认在最后一个轴上排序
np.argsort() 						# 沿着指定的轴,对输入数组的元素值进行排序,并返回排序后的元素索引数组
np.argmax(a,axis=1)					# 返回索引值,axis不传参时返回数组中的最值索引
np.argmin(a) 						# 求最小值索引
np.nonzero()						# 该函数从数组中查找非零元素的索引位置

np.where() 						# 返回值是满足了给定条件的元素索引值。
np.argwhere()					# 该函数返回数组中满足条件元素的索引,若是多维数组则返回行、列索引组成的索引坐标

9.视图和副本

对 NumPy 数组执行些函数操作时,其中一部分函数会返回数组的副本,而另一部分函数则返回数组的视图。其实从内存角度来说

  • 副本就是对原数组进行深拷贝,新产生的副本与原数组具有不同的存储位置
    • ndarray.view() 返回一个新生成的数组副本,因此对该数组的操作,不会影响到原数组。
    • ndarray.copy() 该方法返回原数组的副本,对副本的修改不会影响到原数组
  • 视图可理解为对数组的引用,它和原数组有着相同的内存位置
    • 赋值操作是数组引用的一种方法。比如,将 a 数组赋值给变量 b,被赋值后的变量 b 与 a 组具有相同的内存 id。因此,无论操作 a、b 中哪个数组,另一个数组也会受到影响
    • 使用切片可以创建视图数组,若要修改视图就会影响到原数组

10.线性代数

参考1
参考2

np.dot()   	 # 矩阵乘法arr @ arr3  # 矩阵乘法 若两数组都是一维数组,则计算两个数组的点积,此时等价于np.vdot
np.matmul()
- 1.二者都是矩阵乘法。
- 2.np.matmul中禁止矩阵与标量的乘法。
- 3.在若两个array的维度均为两维的情况下,两个函数的结果是相同的。
- 4.在在若两个array的维度均n>2的情况下,np.matmul()是对应位置的矩阵分别作点积,
	而np.dot()是arrayA的所有矩阵都与arrayB的所有矩阵作点积。
np.vdot()						 # 矩阵的点积,得出一个数

11.保存和加载

np.save(file, arr, allow_pickle=True, fix_imports=True) # 保存为npy

# 它其实就是多个前面np.save的保存的npy,再通过打包(未压缩)的方式把这些文件归到一个文件上
# *args:要存储的数组,可以写多个,如果没有给数组指定Key,Numpy将默认从'arr_0','arr_1'的方式命名
np.savez(file, *args, **kwds) # 保存为npz
np.load(file)

参考链接
在这里插入图片描述


总结

以上就是今天要讲的内容,本文仅仅简单介绍了numpy的使用,而numpy提供了大量能使我们快速便捷地处理数据的函数和方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值