|
|
# -*- 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.fill(x)可以将每一个元素改成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]])#最后三行的1,3,5列(输出整列)
|
|
|
#与切片不同,列表索引生成的会占用新的内存地址
|
|
|
|
|
|
|
|
|
|
|
|
#相关系数矩阵
|
|
|
#相关系数是用以反映变量之间相关关系密切程度的统计指标,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内置函数库学会去查资料")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|