文章目录
NumPy(Numerical Python)是Python的一种开源的数值计算扩展库,它为Python提供了高效的多维数组对象和用于处理这些数组的函数。NumPy广泛应用于科学计算、数据分析、机器学习、图像处理、信号处理等领域。以下是对NumPy的详细介绍:
一维数组索引和切片
ndarray对象的内容可以通过索引或切片来访问和修改,与 Python中 list 的切片操作一样。
ndarray 数组可以基于 0 - n 的下标进行索引,并设置 start, stop及 step 参数进行,从原数组中切割出一个新数组。
一维数组索引和切片的使用
x=np.arange(10)
x[2]
x[2:7:2]
x[2:]
一维数组负索引和切片的使用
x=np.arange(10)
x[-2]
x[-2:]
二维数组的索引和切片
索引直接获取
x=np.arange(1,13)
a=x.reshape(4,3)
print('数组元素')
print(a)
print('获取第二行')
print(a[1])
print('获取第三行第二列')
print(a[2][1])
使用坐标获取数组[x,y]
x=np.arange(1,13)
a=x.reshape(4,3)
print('数组元素')
print(a)
#使用索引获取
print('所有行的第二列')
print(a[:,1])
print('获取第三行第二列')
print(a[2,1])
print('奇数行的第一列')
print(a[::2,0])
print('同时获取第三行第二列,第四行第一列')
print(a[(2,3),(1,0)])
二维数组负索引的使用
print('获取最后一行')
print(a[-1])
print('行进行倒序')
print(a[::-1])
print('行列都倒序')
print(a[::-1,::-1])
切片数组的复制
a=np.arange(1,13).reshape(3,4)
sub_array=a[:2,:2]
sub_array[0][0]=1000
sub_array=np.copy(a[:2,:2])
sub_array[0][0]=2000
改变数组的维度
通过reshape方法可以将一维数组变成二维、三维或者多维数组,也可以通过reshape方法将多维数组变成一维。
改变数组的维度
import numpy as np
#创建一维的数组
a=np.arange(24)
#使用reshape将一维数组变成三维数组
b=a.reshape(2,3,4)
#将a变成二维数组
c=a.reshape(3,8)
#将多维数组变成一维数组
a.reshape(-1)
通过ravel方法或flatten方法可以将多维数组变成一维数组。改变数组的维度还可以直接设置Numpy数组的shape属性(元组类型),通过resize方法也可以改变数组的维度。
#使用ravel函数将三维的b变成一维的数组
a1=b.ravel()
#使用flatten函数将二维的c变成一维的数组
a2=c.flatten()
#使用shape属性将三维的b变成二维数组(6行4列)
b.shape=(6,4)
#使用resize修改数组的维度
b.resize((2,12))
数组的拼接
函数 | 描述 |
---|---|
concatenate | 连接沿现有轴的数组序列 |
hstack | 水平堆叠序列中的数组(列方向) |
vstack | 竖直堆叠序列中的数组(行方向) |
concatenate 函数用于沿指定轴连接相同形状的两个或多个数组,格式如下:
numpy.concatenate((a1, a2, ...), axis)`在这里插入代码片`
- a1, a2, …:相同类型的数组
- axis:沿着它连接数组的轴,默认为 0
列表的拼接
a=[1,2,3]
b=[4,5,6]
a.extend(b)
一维数组的拼接
import numpy as np
x=np.arange(1,4)
y=np.arange(4,7)
print(np.concatenate([x,y]))
二维数组的拼接
a=np.array([[1,2,3],[4,5,6]])
b=np.array([['a','b','c'],['d','e','f']])
print(np.concatenate([a,b]))
print('x轴方向及垂直堆叠')
print(np.concatenate([a,b],axis=0))
print('y轴方向及水平堆叠')
print(np.concatenate([a,b],axis=1))
vstack 与hstack的使用
numpy.hstack它通过水平堆叠来生成数组。
numpy.vstack 它通过垂直堆叠来生成数组。
print(np.vstack([a,b]))
print(np.hstack([a,b]))
三维数组的拼接
aa=np.arange(1,37).reshape(3,4,3)
bb=np.arange(101,137).reshape(3,4,3)
print('axis=0'*10)
print(np.concatenate((aa,bb),axis=0))#6 4 3
print('axis=1'*10)
print(np.concatenate((aa,bb),axis=1))#3,8,3
print('axis=2'*10)
print(np.concatenate((aa,bb),axis=2))#3,4,6
axis=0可以使用vstack替换
axis=1可以使用hstack替换
axis=2可以使用dstack替换
数组的转置
将行与列对调,即第一行变成第一列…或第一列变成第一行…的操作即使转置操作。
transpose进行转换
#transpose进行转置
#二维转置
a=np.arange(1,13).reshape(2,6)
print('原数组a')
print(a)
print('转置后的数组')
print(a.transpose())
print(a.T)
#多维数组转置
aaa=np.arange(1,37).reshape(1,3,3,4)
#将1,3,3,4转换为3,3,4,1
print(np.transpose(aaa,[1,2,3,0]).shape)
数组的分隔
numpy.split 函数沿特定的轴将数组分割为子数组,格式如下:
numpy.split(ary, indices_or_sections, axis)
- ary:被分割的数组
- indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置 (左开右闭)
- axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
split分隔
import numpy as np
x=np.arange(1,9)
a=np.split(x,4)
print(a)
print(a[0])
print(a[1])
print(a[2])
print(a[3])
#传递数组进行分隔
b=np.split(x,[3,5])
print(b)
水平分隔
使用hsplit函数可以水平分隔数组,该函数有两个参数,第1个参数表示待分隔的数组,第2个参数表示要将数组水平分隔成几个小数组。
#水平分割
x=np.arange(16).reshape(4,4)
m,n=np.hsplit(x,2)
print(x)
print(m)
print(n)
垂直分隔
使用vsplit函数可以垂直分隔数组,该函数有两个参数,第1个参数表示待分隔的数组,第2个参数表示将数组垂直分隔成几个小数组。
#垂直分隔
x=np.arange(16).reshape(4,4)
m,n=np.vsplit(x,[2])
print(m)
print(n)
print('三部分'*10)
m,n,z=np.vsplit(x,[1,3])
print(m)
print(n)
print(z)
数学函数
Numpy支持向量处理ndarray对象,提高程序运算速度。
方法 | 说明 |
---|---|
np.abs()、np.fabs() | 计算整数、浮点数的绝对值 |
np.sqrt() | 计算各元素的平方根 |
np.reciprocal() | 计算各元素的倒数 |
np.square() | 计算各元素的平方 |
np.exp() | 计算各元素的指数ex |
np.log() np.log10() np.log2() | 计算各元素的自然对数、底数为10的对数、底数为2的对数 |
np.sign() | 计算各元素的符号,1(整数)、0(零)、-1(负数) |
np.ceil() np.floor() np.rint() | 对各元素分别向上取整、向下取整、四舍五入 |
np.modf() | 将各元素的小数部分和整数部分以两个独立的数组返回 |
np.cos() 、np.sin()、np.tan() | 对各元素求对应的三角函数 |
np.add()、np.subtract()、np.multiply()、np.divide() | 对两个数组的各元素执行加法、减法、乘法、除法 |
求每个元素的倒数
a=[3,4,5,6,7,8]
b=np.array(a)
result=[]
for i in a:
result.append(1/i)
print('result1:',result)
print('result2:',[1/i for i in a])
#直接对列表求导数不可以,但ndarray类型可以直接求导数
# print('result3:',1/a)
print('result4:',1/b)
numpy.reciprocal() 函数返回参数逐元素的倒数。如 1/4 倒数为4/1。
reciprocal()函数的使用
a=np.arange(1,10,dtype=np.float).reshape(3,3)
print(np.reciprocal(a))
square()函数的使用
#一维数组
a = np.arange(1,10)
np.square(a)
#传统方式
np.array([i*i for i in a])
#二维数组
aa = np.arange(1,13).reshape(3,4)
np.square(aa)
#传统方式
bb = np.ones_like(aa)
for x in range(3):
for y in range(4):
bb[x,y] = aa[x,y]*aa[x,y]
sign()函数的使用
#sign的使用
#计算各元素的符号,1(整数)、0(零)、-1(负数)
a=np.arange(-5,5)
np.sign(a)
modf()函数的使用
#modf的使用
b = np.arange(-5,5,0.4)
#将各元素的小数部分和整数部分以两个独立的数组返回
np.modf(b)
三角函数的使用
x=np.linspace(1,10,10)
y=np.sin(x)
print(y)
around、floor、ceil函数的使用
#around、floor、ceil函数的使用
#numpy.around(a,decimals)
#decimals: 舍入的小数位数。 默认值为0。 如果为负,整数将四舍五入到小数点左侧的位置
#numpy.floor() 返回数字的下舍整数。
#numpy.rint() 四舍五入
#numpy.ceil() 返回数字的上入整数。
a=np.array([1.0,4.55,123,0.567,25.532])
print(np.around(a))
print(np.around(a,decimals=1))
print(np.around(a,decimals=-1))
print(np.floor(a))
print(np.rint(a))
print(np.ceil(a))