You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
python/numpy库.py

257 lines
9.2 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# -*- coding: utf-8 -*-
"""
Created on Thu Dec 2 12:30:24 2021
@author: Administrator
"""
import numpy as np
#numpy的数组对象及其索引
lst1=[1,2,3,4,5,6]#如果要对每一个元素增加1列表本身实现不了
lst2=[n+1 for n in lst1]#可以通过列表生成式完成
print(lst2)
#想实现lst1与lst2的每一个对应元素相加
lst3=[n1+n2 for (n1,n2) in zip(lst1,lst2)]
print(lst3)
#产生数组
arr1=np.array(lst1)#通过array从列表产生
print(arr1)
arr1=np.zeros(5,dtype="int")#生成全0数组个数为5,默认给到浮点数0.0,通过dtype=""来给到自己想要的数据类型
#仿照上述也可以np.ones(number),生成全1数组
#a1.fillx可以将每一个元素改成x,但要求与原数组type相同
#强制的数据类型转换
arr1=arr1.astype("float")#数据类型转换为float
arr1.fill(2.5)#全体换成2.5
print(arr1)
arr1=np.array([1,2,3,4])#通过array直接加上列表
print(arr1)
arr2=arr1+1#对每一个元素增加1
print(arr2)
arr3=arr1*2#每一个元素*2
print(arr3)
brr1=np.array([2,4,6,8])
print(arr1+brr1)#a1与b1的每一个对应元素相加
#特殊数组产生方式
crr1=np.arange(1,10,2)#含头不含尾(start,end,step)arange函数用于创建等差数组
crr1=np.linspace(1,10,21)#含头含尾(start,end,total)linspace创建start到end的共total个数的等差数列
#np.arange(),np.linspace()通常用于创建等差数组.前者需要指定初始值、结束值和步进。后两者则需要给定初始值、结束值和元素的个数。
np.random.randint(1,10,6)#随机生成1到10的6个随机整数
np.random.uniform(1,10,6)#随机生成1到10的6个随机浮点数
np.random.rand(100,1)
np.random.randn(10)#随机生成0到1的10个 正态分布 浮点数
np.random.random((2,2))#(维度)
arr=np.random.randint(0,10,24)
arr.shape=(4,6)
type(arr1)
#Out[3]: numpy.ndarray 返回a1的数据类型
arr1.dtype
#Out[5]: dtype('int32') 返回a1中的数据的数据类型
arr1.size
#Out[6]: 4 返回a1中数据的个数
arr1.ndim
#Out[9]: 1 返回a1的维度
arr1.shape
#Out[7]: (4,) 返回一个元组每一个元素代表这一维度的元素数目本例中a1只有一维
#索引与切片
#和列表差不多,详见列表
a4=np.array([1,2,3,4,5,6,7])
a4=np.append(a4,8)#向末尾添加一个元素
print(a4)
print(a4[0])
a4[0]=10#改变
print(a4)
print(a4[1:4])#切片,只能切到连续的
#数组操作
filmname=np.array(["肖申克的救赎","霸王别姬","这个杀手不太冷","教父","末代皇帝","放牛班的春天"])
num=np.array([343243,544643,453545,342334,334443,243324])
score=np.array([9.4,9.6,9.9,9.3,8.7,8.9])
length=np.array([112,122,116,109,92,133])
#排序
print(np.sort(num))#默认从小到大
order1=np.argsort(num)
print(order1)#返回从小到大的排列在数组中的索引位置
print(filmname[order1[0]])#返回 放牛班的春天,想想这是什么操作?
order2=np.argsort(score)
print(filmname[order2[-1]])
print(filmname[order2[::]])
#求和
print(np.sum(num))
#max&min
max1=np.max(score)
print(max1)
min1=np.min(score)
print(min1)
#中位数
mid1=np.median(score)
print(mid1)
#均值和标准差
ave1=np.mean(length)#均值
print(ave1)
std1=np.std(length)#标准差
print(std1)
#where语句:条件判断,返回索引
arr1=np.array([0,12,5,7,88,20])
arr1>10#只会返回bool型
#Out[29]: array([False, True, False, False, True, True])
print(np.where(arr1>10))#返回所有>10的索引为一个元组
print(np.where(arr1>10)[0][0])#从元组到array再到具体的数
print(arr1[np.where(arr1>10)])#])#返回所有>10的元素为一个数组(完成条件选择)
#记录累计票房
ob=np.array([21800,22300,24500,27999])
#计算每日票房
ob_=np.array([21000,21800,22300,24500])
print(ob-ob_)
#多维数组
xrr1=np.array([[0,1,2,3],[10,11,12,13]])#二维数组,本质就是嵌套列表
xrr1.shape
xrr1.size
xrr1[1,3]=-1#[a,b]使用多个数字来完成索引a是行索引b是列索引
arr5=xrr1[1]#索引整个第一个列表,就是索引整行
arr6=xrr1[::,2]#索引整个第二列(数学上是第三列)
xrr2=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
print(xrr2[0,3:5])#得到第一行的第四和第五个
print(" ")
print(xrr2[4:,4:])#得到最后两行最后两列
print(" ")
print(xrr2[2,:])#第三行
print(" ")
print(xrr2[:,2])#第三列
print(" ")
print(xrr2[::,::2])#取出奇数列
print(xrr2[1::2,::])#取出偶数行
#numpy中的数组切片是引用机制即改变切片就会影响原数组
a1=np.array([1,2,3,4])
b1=a1[2:4]
b1[1]=10
print(a1)
#[ 1 2 3 10]a1也改变了这和列表是不同的
#可以b1=a1[2:4].copy()去生成复制,复制会占用新的内存
#列表索引:切片只能连续或等间隔,列表索引来实现任意位置的操作
crr3=np.arange(0,100,10)
print(crr3)
print(crr3[[1,2,-3]])#花式一维索引
mask=np.array([0,1,2,0,0,1,0,2,0,1],dtype=bool)#mask长度必须与数组长度相同
print(mask)
print(crr3[mask])#把其中True的对应位置取出来
xrr2=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
print(xrr2[[0,1,2,3,4,5],[5,4,3,2,1,0]])#输出副对角线(输出二维单个数)
print(xrr2[3:,[0,2,4]])#最后三行的135列输出整列
#与切片不同,列表索引生成的会占用新的内存地址
#相关系数矩阵
#相关系数是用以反映变量之间相关关系密切程度的统计指标,r>0表示正相关,r<0表示负相关,|r|表示了变量之间相关程度的高低
#相关矩阵第i行第j列的元素是原矩阵第i列和第j列的相关系数
r1=np.corrcoef(score,length)
print(r1)
r2=np.corrcoef(score,num)
print(r2)
#相关指数R平方,R方范围0到1全闭越接近1拟合程度越好
#协方差矩阵
#协方差用于衡量两个变量的总体误差
#方差是协方差的一种特殊情况,即当两个变量是相同的情况。
#协方差表示的是两个变量的总体的误差,这与只表示一个变量误差的方差不同。如果两个变量的变化趋势一致,也就是说如果其中一个大于自身的期望值,另外一个也大于自身的期望值,那么两个变量之间的协方差就是正值。如果两个变量的变化趋势相反,即其中一个大于自身的期望值,另外一个却小于自身的期望值,那么两个变量之间的协方差就是负值。
#协方差矩阵第i行第j列的元素是原矩阵第i个变量和第j个变量的协方差
cov1=np.cov(score,length)
print(cov1)
#多维数组操作
x2=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
x2.shape=12,3#将x2改成12维度每个维度3个元素的数组
x3=np.array([[0,1,2,3,4,5],[10,11,12,13,14,15],[20,21,22,23,24,25],[30,31,32,33,34,35],[40,41,42,43,44,45],[50,51,52,53,54,55]])
x4=x3.reshape(3,12)#不会改变原x3
x5=x3.reshape(-1,6)#-1表示自动匹配
#数组连接
arr1=np.array([1,2,3,4])
arr2=arr1+1#对每一个元素增加1
arr3=np.concatenate((arr1,arr2),axis=0)#除了给定的轴外,其他轴的长度必须一致
arr4=np.array([[0,1,3],[2,5,7]])#多维数组一定要记得最外端的中括号
arr5=np.array([[2,4,7],[11,22,33]])
print(arr4.shape)
print(arr5.shape)#要相同
arr6=np.concatenate((arr4,arr5),axis=0)#横向链接,vstack
np.r_[arr4,arr5]#按列连接
arr7=np.concatenate((arr4,arr5),axis=1)#纵向链接,hstack
np.c_[arr4,arr5]#按行连接
#a4,a5连接成三维数组,dstack
arr8=np.array((arr4,arr5))
print(np.vstack((arr4,arr5)))
print(np.hstack((arr4,arr5)))
print(np.dstack((arr4,arr5)))
#广播运算
#向量运算函数对m*n矩阵,如果参数axis=0,列为单位进行运算结果是向量参数axis=1,行为单位进行运算,结果也是向量; 如果不指定axis参数则对矩阵的所有参数进行计算结果是个标量
#max(),min(),sum(),mean(),prod()求乘积sort函数
#矩阵运算函数 diag(),dot(),trace(),det()....
#numpy的基本运算标量向量和矩阵
#广播运算
data1 = [[6, 7.5, 8, 0, 1], [3.2, 3, 7, 52, 23.4]]
arr1 = np. array( data1)
arr1 = arr1* 2 #这是广播运算
print(arr1)
#print(1/arr1)
#print(arr1**0.5)
#标量运算
print(np.sum([1,2,3,4]))
print(np.sqrt(100))
print(np.abs(-10))
#向量运算
arr2d=[[6, 7.5, 8, 0, 1], [3.2, 3, 7, 52, 23.4]]
print(np.sum(arr2d))
print(np.min(arr2d,axis=1)) #求每一行中的最小值,向量
np.mean(arr2d,axis=0) # 求每一列的平均值,向量
#矩阵运算函数diag(),dot(),trace(),det()....
import numpy as np
A = np.array([[m + n for m in np.arange(4)] for n in np.arange(4)]) # 4 x 4 2D arrays
B = np.array([[m - n for m in np.arange(3)] for n in np.arange(4)]) # 4 x 3 2D arrays
C = np.arange(4) # 1D vector with a size of 4
#A, B, C
print(A)
print(B)
print(C)
print(A.shape)
print(B.shape)
print(C.shape)
#计算矩阵相乘
print(np.dot(A, B), '\n')
print(np.dot(A, C))
print(np.dot(C, A))#数学上的矩阵相乘
print("numpy内置函数库学会去查资料")