Numpy基础知识

本文介绍了Numpy的基础知识,包括基本操作和运算、数组合并与拆分、copy与=的区别、广播机制、类型转换及常用函数的使用。通过示例展示了axis参数的运用、数组维度、形状、元素数量和数据类型的获取。还涵盖了数组的合并、拆分、复制以及与标量的广播计算。此外,讨论了类型转换,如将整数列表转为浮点数数组,并演示了求和、精度调整和取整等常用函数的应用。
摘要由CSDN通过智能技术生成
import numpy as np

axis = i 就在 i 这个维度上进行操作
ndim 维度
shape 形状
size 元素个数
dtype 数据类型

#创建连续型数据
a=np.linspace(1,10,5)  #首1,尾10,分成5个数据
print(a)

[ 1. 3.25 5.5 7.75 10. ]

基本操作和运算

A = [[1,2,-5],
     [-2,-7,4],
     [1,-3,6]]
np.exp(A)  #求e^A
np.log(A)  #求log(A)
np.abs(A)  #求绝对值
np.maximum(A, 0)  #求出矩阵A中所有元素和0之间相比的最大值
A**2  #A中每个元素的平方
1/A   #A中每个元素的倒数

np.dot(A,B)  #对应相乘再求和  A.dot(B)  @ 相当于 dot()
np.sum()  #矩阵中数求和
np.sum(A,axis=0) #按列进行求和
np.sum(A,axis=1) #按行进行求和
np.min()  #矩阵中最小的值
np.mean()  #整个矩阵的均值  a.mean()  accuracy = np.mean(y_pred_label == y_true_label)

np.bincount()  #计算索引出现的次数
np.argmin()  #返回最小值元素的索引
np.argmax()  #返回最大值元素的索引
np.argmax(x,axis=0)  #按列操作返回最大元素的索引位置
np.argmax(x,axis=1)  #按行操作返回最大元素的索引位置,对于同为最大值,返回第一个的位置索引即可

np.average()  #平均数
np.median()  #中位数
np.cumsum()  #累加,每个位置的数是前边所有数与当前位置数的和
np.diff()  #累差运算
np.nonzero()  #将非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵

np.sort(A)  #只是对每行进行递增排序
sort()  #函数 sort()用于列表list中元素的排序,list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值
sorted()  #排序,sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作,reverse -- 排序规则,reverse = True 降序 , reverse = False 升序(默认)
np.argsort()  #返回的是数组值从小到大的索引值

np.transpose(A)  #矩阵转置  A.T
np.clip(A,5,9)   #对矩阵A中的数,比5小的数变为5,比9大的变为9,其他的不变
#clip(Array,Array_min,Array_max) 
#若Array中的元素在[Array_min,Array_max],则该对应位置为原数
#若Array中的元素在<Array_min,则该对应位置为Array_min
#若Array中的元素在>Array_max,则该对应位置为Array_max

np.flatten()  #多维转一维,返回一份拷贝,对拷贝所做修改不会影响原始矩阵
np.rave() #多维数组降为一维,返回的是视图,修改时会影响原始矩阵 
np.expand_dims()  #在axis位置上增加一个维度
np.squeeze()  # 去掉维度为1的维

zip()  
'''
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,
然后返回由这些元组组成的列表。
如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,
利用 * 号操作符,可以将元组解压为列表。
在 Python 3.x 中为了减少内存,zip() 返回的是一个对象。如需展示列表,需手动 list() 转换。

'''
map()
'''
map() 会根据提供的函数对指定序列做映射。
第一个参数 function 以参数序列中的每一个元素调用 function 函数,
返回包含每次 function 函数返回值的新列表。
'''
np.unique()  #对于一维数组或者列表,unique函数去除其中重复的元素,并按元素由小到大返回一个新的无元素重复的元组或者列表
np.reshape(A, (m,n)) # m行n列
np.logical_and()  #逻辑与

#合并
np.stack()
np.vstack((A,B))  #vertical stack上下合并
np.hstack((A,B))  #水平合并
np.dstack((A,B))  #深度合并
np.concatenate((A,B),axis=0)  #纵向合并
np.concatenate((A,B),axis=1)  #横向合并

#拆分
np.split(A,2,axis=1)  #沿横向轴拆分,等价于np.hsplit(A,2)
np.hsplit(A,2)  #沿横向轴拆分(axis=1)
np.split(A,3,axis=0)  #沿纵向轴拆分,等价于np.vsplit(A,3)
np.vsplit(A,3)   #沿纵向轴拆分(axis=0)
np.dsplit()  #深度拆分

np.greater_equal(x1, x2)  #以元素方式返回(x1> = x2)的真值(True / False)
#np.greater_equal(y_pred_numpy, 0.5).astype(np.float32)
np.equal(x1, x2)  #以元素方式返回(x1 == x2)的真值(True / False)

z,s = np.meshgrid(x, y)  #从坐标向量返回坐标矩阵,将 x 变成了矩阵 z 的行向量,y 变成了矩阵 s 的列向量

np.where()  
'''
np.where(condition, x, y)
满足条件(condition),输出x,不满足输出y。

np.where(condition)
只有条件 (condition),没有x和y,则输出满足条件 (即非0) 元素的坐标 (等价于numpy.nonzero)。
这里的坐标以tuple的形式给出,通常原数组有多少维,输出的tuple中就包含几个数组,
分别对应符合条件元素的各维坐标。
'''
np.flatnonzero(x == 3)  #返回某个特定元素的位置

np.round(x)  #返回浮点数x的四舍五入值
np.around()  #近似取整
np.floor()  #向下取整
np.ceil()  #向上取整

np.linalg.inv()  #矩阵求逆  A.I
np.linalg.det()  #矩阵求行列式(标量)
np.linalg.norm()   #求范数
np.tile([0,1,2],(4,1)) #  [0,1,2]   行重复4次,列重复1次
a.tolist()  #数组a 转换成list,使用tolist()
a.astype(float)  #转换成指定类型

# 一维矩阵运算
a=np.array([1,2,3,4])
b=np.arange(4)
print(a,b)

c1=a-b   #对应相减
print(c1)

c2=a*b  #对应相乘
print(c2)

c3=a.dot(b) #对应相乘再求和
#c3=np.dot(a,b)
print(c3)  

c4=b**2 #相应位置平方
print(c4)  

c5=np.sin(a)  #数学函数工具求sin
print(c5)

print(a<2)

在这里插入图片描述

#多维矩阵运算
a=np.array([[1,1],[0,1]])
b=np.arange(4).reshape((2,2))
print(a)
print(b)

c1=a.dot(b) #矩阵乘a*b
print(c1)

a=np.random.random((2,4))
print(a)
print(np.sum(a))
print(np.min(a))
print(np.mean(a))

在这里插入图片描述

c2=np.sum(a,axis=0) #按列进行求和
c3=np.sum(a,axis=1) #按行进行求和
#矩阵基本计算
A=np.arange(2,14).reshape((3,4))
print(A)

print('最小值元素索引%d'% np.argmin(A))
print('最大值元素索引%d'% np.argmax(A))
print('整个矩阵的均值%f'% np.mean(A))
print(np.average(A))
print(A.mean())

print(np.median(A)) #中位数

print(np.cumsum(A))  #累加,每个位置的数是前边位置的和

print(np.diff(A)) #累差运算

B=np.array([[3,5,9],[4,8,10]])
print(np.nonzero(B))  #将非零元素的行与列坐标分割开,重构成两个分别关于行和列的矩阵

A=np.arange(14,2,-1).reshape((3,4))
print(A)
print(np.sort(A))#只是对每行进行递增排序

print(np.transpose(A)) #矩阵转置
print(A.T)

print(A)
print(np.clip(A,5,9))   
#clip(Array,Array_min,Array_max) 
#若Array中的元素在[Array_min,Array_max],则该对应位置为原数
#若Array中的元素在<Array_min,则该对应位置为Array_min
#若Array中的元素在>Array_max,则该对应位置为Array_max

数组合并

#数组合并
A=np.array([1,1,1])
print(A)
B=np.array([2,2,2])
print(np.vstack((A,B)))  #vertical stack上下合并

C=np.vstack((A,B))
print(C)

print(A.shape,B.shape,C.shape)

D=np.hstack((A,B))
print(D)

print(A.shape,B.shape,D.shape)

在这里插入图片描述

#深度合并
b=np.array([[0,1,20,3,4,5],[6,7,8,9,10,11]])
c=b*2
arr_dstack=np.dstack((b,c))
print(arr_dstack.shape)
arr_dstack

在这里插入图片描述

#数组转置为矩阵
print(A[np.newaxis,:])
print(A[np.newaxis,:].shape)
print(A[:,np.newaxis])

在这里插入图片描述

#多个矩阵合并p
print(A)
print(B)
A=A[:,np.newaxis]  #数组转置
B=B[:,np.newaxis]  #数组转置
print(A)
print(B)

在这里插入图片描述

#纵向合并
C1=np.concatenate((A,B),axis=0)
print(C1)

在这里插入图片描述

#横向合并
C2=np.concatenate((A,B),axis=1)
print(C2)

在这里插入图片描述

数组拆分

#构造矩阵
A=np.arange(12).reshape((3,4))
print(A)

[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]

#沿横向轴拆分(axis=1)
np.hsplit(A,2)
#np.split(A,2,axis=1)

在这里插入图片描述

#沿纵向轴拆分(axis=0)
np.vsplit(A,3)
#np.split(A,3,axis=0)

[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8, 9, 10, 11]])]

#深度拆分
arr_dstack

在这里插入图片描述

np.dsplit(arr_dstack,2)

在这里插入图片描述

copy 和 =

#=号赋值的关联性
a=np.arange(4)
print(a)

[0 1 2 3]

b=a
c=a
d=b
print(b)
print(c)
print(d)

[0 1 2 3]
[0 1 2 3]
[0 1 2 3]

a[0]=11  #a中元素发生改变,b,c,d中的元素同样变化
print(a)
print(b)
print(c)
print(d)

[11 1 2 3]
[11 1 2 3]
[11 1 2 3]
[11 1 2 3]

d[1:3]=[12,13] #d中元素发生变化,a,b,c中的元素同样变化
print(a)
print(b)
print(c)
print(d)

[11 12 13 3]
[11 12 13 3]
[11 12 13 3]
[11 12 13 3]

#copy()赋值没有关联性
a=np.arange(4)
print(a)
b=a.copy()
print(b)

[0 1 2 3]
[0 1 2 3]

a[3]=44
print(a)
print(b)

[ 0 1 2 44]
[0 1 2 3]

广播机制

当数组跟一个标量进行计算时,标量需要根据数组的形状进行扩展,然后执行运算。该扩展过程称为“广播”

a=np.array([[0,0,0],[10,10,10],[20,20,20],[30,30,30]])
b=np.array([0,1,2])
print(a+b) #a,b的维度不一样,在进行计算的时候会将b广播后计算

[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]

#相当于将b重复多次
b=np.tile([0,1,2],(4,1)) #b行重复4次,列重复1次
print(a)
print(b)
print(a+b)

[[ 0 0 0]
[10 10 10]
[20 20 20]
[30 30 30]]
[[0 1 2]
[0 1 2]
[0 1 2]
[0 1 2]]
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 31 32]]

数组的类型转换

#数组转换成list,使用tolist()
a=np.array([[0,1,20,3,4,5],[6,7,8,9,10,11]])
print(a.tolist())

#转换成指定类型
print(a.astype(float))

[[0, 1, 20, 3, 4, 5], [6, 7, 8, 9, 10, 11]]
[[ 0. 1. 20. 3. 4. 5.]
[ 6. 7. 8. 9. 10. 11.]]

常用函数

#bincount()计算索引出现次数
x=np.array([1,2,3,3,0,1,4,0])
print(np.bincount(x))
#索引0出现2次,索引1出现2次,索引2出现1次,索引3出现2次,索引4出现1次,所以输出[2,2,1,2,1]
#x中最大数为4,那么bin中统计的索引只能为0-4的5个数字,统计它们在x中出现的次数

[2 2 1 2 1]

w=np.array([0.3,0.5,0.7,0.6,0.1,-0.9,1,0.2])
print(np.bincount(x,weights=w))

[ 0.3 -0.6 0.5 1.3 1. ]

print(np.bincount(x,weights=w,minlength=7))  #bincount中元素为5个,当设置长度为7时,后边两位设为0

[ 0.3 -0.6 0.5 1.3 1. 0. 0. ]

#argmax
x=[[1,3,3],[7,5,2]]
print(np.argmax(x)) #返回最大元素中的位置
print(np.argmax(x,axis=0))  #按列操作返回最大元素的索引位置
print(np.argmax(x,axis=1))  #按行操作返回最大元素的索引位置,对于同为最大值,返回第一个的位置索引即可

3
[1 1 0]
[1 0]

求取精度

np.around([-0.6,1.2798,2.357,9.67,13],decimals=0)
np.around([1.2798,2.357,9.67,13],decimals=1)
np.around([1.2798,2.357,9.67,13],decimals=2)  #decimals指定保留几位小数
np.around([1,2,5,6,56],decimals=-1)  #-1表示看整数部分最后一位数决定是否进位,大于5进位,小于5省去
np.around([1,2,5,6,56],decimals=-2)  #-2表示看整数部分最后两位数决定是否进位,大于50进位,小于50省去

[ 0 0 0 10 60]
[ 0 0 0 0 100]

import numpy as np
print(np.around([-17.634,123.2798,255.357,950.67123,16],decimals=-1))
print(np.around([-17.634,123.2798,255.357,949.67123,16],decimals=-2))

[-20. 120. 260. 950. 20.]
[ -0. 100. 300. 900. 0.]

取整

#向下取整
np.floor([-0.6,-1.4,-0.1,-1.8,0,1.4,1.7])

array([-1., -2., -1., -2., 0., 1., 1.])

#向上取整
np.ceil([1.2,1.5,1.8,2.1,2.0,-0.5,-0.6,-0.3])

array([ 2., 2., 2., 3., 2., -0., -0., -0.])

#查找
x=np.array([[1,0],[2,-2],[-2,1]])
x

在这里插入图片描述

np.where(x>0,x,0)  #大于0的数不变,小于0的值用0填充

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值