Bootstrap

python—NumPy的基础(2)


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))
;