1,Numpy
中文网站:https://www.numpy.cn
本文只介绍numpy中的常用方法,更丰富的内容可以在中文网站中查找
Numpy是使用Python进行科学计算的基础软件包,他可以对N维数组进行处理(矩阵)。
(1)numpy属性
numpy.array
numpy.ndim
numpy.shape
numpy.size
numpy.dtype
import numpy as np #引入numpy库,并把它重命名为np
array=np.array([10,20,30]
[40,50,60]
[70,80,90]) #利用numpy的array方法创建多维数组,并创建array对象
print (array) #运行结果为 [[10 20 30]
# [40 50 60]
# [70 80 90]]
print(array.ndim) #输出array多维数组的维度 输出结果为2(中括号包含一个中括号
#,内外层一共两个中括号,所以为2维)
print(array.shape) #输出array多维数组的形状 输出结果为(3,3)
print(array.size) #输出array多维数组的大小,即总共有多少元素 输出结果为9
print(array.dtype) #输出array多维数组的元素类型 输出结果为int32
(2)创建array
numpy.array()
numpy.zeros
numpy.ones
numpy.arange(i,j,k)
numpy.reshape(i,j)
import numpy as np
a=np.array([11,12,13],dtype=np.int32) #第一个参数是数据,第二个参数指明数据类型
print(a) #输出结果为[11 12 13]
print(a.dtype) #输出结果为int32
b=np.array([21,22,23],dtype=float) #也可以指明为浮点类型
c=np.array([31,32,33]) #一维数据
d=np.array([[10,20,30]
[40,50,60]) #二维数据
zero=np.zeros((3,3)) #生成3行3列元素全为0的矩阵
#输出结果为[[0. 0. 0.]
# [0. 0. 0.]
# [0. 0. 0.]]
one=np.ones((3,4)) #生成3行4列元素全为1的矩阵
e=np.arange(12) #生成从0到11的一维数组
#输出结果[0 1 2 3 4 5 6 7 8 9 10 11]
f=np.arange(4,12) #生成从4到11的一维数组
#输出结果[4 5 6 7 8 9 10 11]
g=np.arange(1,12,3) #生成从1到11,步长为3的整型数列
#输出结果[1 4 7 10]
h=np.arange(12).reshape(4,3) #用reshape方法重新定义矩阵形状,[4,3]为3行4列
#[[0 1 2]
# [3 4 5]
# [6 7 8]
# [9 10 11]
(3)numpy的运算1
arr1+arr2
arr1-arr2
arr1*arr2
arr1/arr2
arr1+i
arr1*i
arr1>i
np.dot(arr1,arr2) 或者 arr1.dot(arr2)
arr1.T
numpy.transpose(arr1)
import numpy as np
arr1=np.array([[1,2,3]
[4,5,6]])
arr2=np.array([[7,8,9]
[3,5,6]])
print(arr1+arr2) #各元素相加
#输出结果[[8 10 12]
# [7 10 12]]
print(arr1-arr2)
print(arr1*arr2)
print(arr1**arrr2) #输出结果[[1 256 19683]
# [64 3125 46656]]
print(arr1/arr2) #输出结果[[0.14285714 0.25 0.33333333]
[1.33333333 1. 1. ]]
print(arr1+2) #每个元素都加2
print(arr1*10) #每个元素都乘10
arr3=arr1>3 #对arr1中的元素进行判断,大于3的元素输出True,否则为Flase
print(arr3) #输出结果[[Flase False False]
# [True True True ]]
arr4=np.ones((3,5))
np.dot(arr1,arr4) #dot方法实现两个矩阵相乘,矩阵乘法规则参考线性代数
arr1.dot(arr4) #效果和上述矩阵乘法相同
print(arr1.T) #矩阵转置
print(np.transpose(arr1)) #矩阵转置,与上述效果相同
(4)随机数生成以及矩阵的运算2
numpy.random.randint(i,j,size=(k,a))
numpy.sum(sample1,axis=i)
numpy.min(sample1)
numpy.max(sample1)
numpy.argmin(sample1)
numpy.argmax(sample1)
numpy.median(sample1)
numpy.mean(sample1) 或sample1.mean()
numpy.sqrt(sample1)
numpy.sort(sample1)
numpy.clip(sample1,i,j)
import numpy as np
sample1=np.random.randint(0,10,size=(4,3)) #生成4行3列从0到10的随机整数
#输出的一种可能结果
#[[7 7 9]
[4 4 3]
[8 9 4]
[8 3 0]]
sample2=np.random.randint(0,10,size=(4,3))
np.sum(sample1) #求数组里所有元素的和 输出结果为66
np.min(sample1) #输出数组中元素的最小值 输出结果为0
np.max(sample1) #输出数组中元素的最大值 输出结果为9
np.sum(sample1,axis=0) #对数组中各列求和 输出结果为array([27,23,16})
np.sum(sample1,axis=1) #对数组中各行求和 输出结果为array([23,11,21,11])
np.argmin(sample1) #求数组中元素最小值的索引 输出结果为11
np.argmax(sample1) #求数组中元素最大值的索引 输出结果为2
np.median(sample1) #求数组元素中所有元素的中位数
np.mean(sample1) #求sample1所有元素的平均值 输出结果为7.33333333
sample1.mean() #上述求平均值的另一种写法
np.sqrt(sample1) #对数组中每个元素开方
np.sort(sample1) #对每一行元素从大到小进行排序,输出结果
#[[7 7 9]
# [3 4 4]
# [4 8 9]
# [0 4 8]]
np.clip(sample1,3,6) #数组中的元素小于3就变成3,大于6就变成6,输出结果
#[[6 6 6]
# [3 4 4]
# [6 6 4]
# [6 3 3]]
(5)numpy的索引
各种索引
迭代行,迭代列,迭代每个元素(.flat方法)
import numpy as np
arr1=np.arange(2,17)
print(arr1[3]) #输出索引值为3的数,即5
print(arr1[2:5]) #输出索引值为2的数到索引值为4的数,即[4 5 6]
#切片索引时,:前的数输出,:后的数不输出,即从2到4
print(arr1[3:-1]) #输出索引值为3的数到索引值为-2的数(-1是从后往前为第一个数)
#[5 6 7 8 9 10 11 12 13 14 15]
print(arr1[:6]) #输出前6个数据,即[2 3 4 5 6 7]
print(arr1[-2:]) #输出最后两个数据,即[15 16]
arr2=arr1.reshape(3,5)
print(arr2) #输出结果为[[2 3 4 5 6]
# [7 8 9 10 11]
# [12 13 14 15 16]]
print(arr2[1]) #输出第2行,输出结果为[7 8 9 10 11]
print(arr2[1][1]) #输出第二行第二列的数,即8
print(arr2[1,1]) #输出第二行第二列,跟上一个效果一样
print(arr2[:,2]) #输出每一行下标为2的元素,[4 9 14]
for i in arr2:
print(i) #迭代每一行
#输出结果[2 3 4 5 6]
# [7 8 9 10 11]
# [12 13 14 15 16]
for i in arr2.T:
print(i) #迭代每一列
for i in arr2.flat:
print(i) #迭代每一个元素,flat方法可以把多维展开成一维
(6)array合并(对数组的合并操作)
numpy.vstack((arr1,arr2,arr3,......))
numpy.hstack((arr1,arr2,arr3,......))
numpy.concatenate((arr1,arrr2,arr3......),axis=k)
numpy.newaxis
numpy.atleast_2d(arr1)
import numpy as np
arr1=np.array([1,2,3])
arr2=np.array([4,5,6])
arr3=np.vstack((arr1,arr2)) #垂直合并
print(arr3) #输出结果为[[1 2 3]
# [4 5 6]]
arr4=np.hstack((arr1,arr2)) #水平合并
print(arr4) #输出结果为[1 2 3 4 5 6]
arrv=np.vstack((arr1,arr2,arr3)) #也可以把多个数组进行合并
arr=np.concatenate((arr1,arr2,arr1)) #连接array组成一个新的array
#输出结果为[1 2 3 4 5 6 1 2 3]
arr=np.concatenate((arr3,arrv),axis=0)#合并的array维度要相同
#,形状要匹配,axis=0表示纵向合并
arr=np.concatenate((arr3,arr3),axis=1)#axis=0表示横向合并
arr1=arr1[np.newaxis,:] #增加一个维度
print(arr1) #输出结果为 [[1 2 3]]
arr1=arr1[:,np.newaxis] #每个元素都增加一个维度
print(arr1) #输出结果为[[1]
# [2]
# [3]]
arr1=np.array([1,2,3])
arr1_2=np.atleast_2d(arr1) #将输入的数组转化为至少二维
print(arr1_2) #输出结果为[[1 2 3]]
(7)array分割(数组分割)
numpy.split(arr1,k,axis=j)
numpy.array_split(arr1,k,axis=j)
numpy.hsplit(arr1,k)
numpy.vspilt(arr1,k)
import numpy as np
arr1=np.arange(12).reshape((3,4))
print(arr1) #输出结果[[0 1 2 3]
# [4 5 6 7]
# [8 9 10 11]]
arr2,arr3=np.split(arr1,2,axis=1) #将arr1水平方向分割,分成两份
#也可以使用numpy.hsplit(arr1,2)来实现
print(arr2) #输出结果[[0 1]
# [4 5]
# [8 9]]
print(arr3) #输出结果[[2 3]
# [6 7]
# [10 11]]
arr4,arr5,arr6=np.split(arr1,3,axis=0) #将arr1垂直方向分割,分成三份
#也可以使用numpy.vsplit(arr1,3)来实现
print(arr4) #输出结果[[0 1 2 3]]
#如果将arr1水平分割为3份会报错,split方法用于均分
#要不均等分割就要使用numpy.array_split()方法
arr7,arr8,arr9=np.array_split(arr1,3,axis=1)#水平方向分割,分成3份,不等分割
print(arr7) #输出结果[[0 1]
# [4 5]
# [8 9]]
print(arr8) #输出结果[[ 2]
# [ 6]
# [ 10]]
print(arr9) #输出结果[[ 3]
# [ 7]
# [ 11]]
(8)numpy的浅拷贝和深拷贝
numpy.copy
import numpy as np
arr1=np.array([10 20 30])
arr2=arr1 #arr1和arr2共享一块内存,arr2的元素变化arr1中的元素也相应变化
#浅拷贝
arr2=arr1.copy() #arr2和arr1不再共享,arr1就是arr1,arr2就是arr2
#深拷贝
2,Pandas
中文网站:https://www.pypandas.cn
本文只介绍pandas中的常用方法,更丰富的内容可以在中文网站中查找
Pandas是一个强大的分析结构化数据的工具集,它是基于numpy开发的
Pandas的两大利器为Series和DataFrame: Series是一种类似于一维数组的对象,它由一组数据(各种Numpy数据类型)以及一组与之相关的数据标签(即索引)组成。 Series的字符串表现形式为:索引在左边,值在右边。由于没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引。 DataFrame是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,它可以被看做由Series组成的字典(共用同一个索引)。跟其他类似的数据结构相比(如R的data.frame),DataFrame中面向行和面向列的操作基本上是平衡的。其实,DataFrame中的数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。 虽然DataFrame是以二维结构保存数据的,但你仍然可以轻松地将其表示为更高维度的数据(层次化索引的表格型结构,这是pandas中许多高级数据处理功能的关键要素)
这里看不懂可以根据下述事例进行理解
(1)pandas基础,Series,DataFrame
1.Series
import pandas as pd
import numpy as np
s1=pd.Series([5,-7,3,2])
print(s1)
#输出结果为
#0 5
#1 -7
#2 3
#3 2
#可以看到用Series创建的对象系统可以自动给它指定索引值并且可以输出
#每个索引值对应着一个值,且是有序的
#这种特征就类似于字典的键值对对应关系,但是字典内的元素是无序的,而Series的
#元素是有序的,当然Series创建的索引值可以是任意类型,如下代码
s2 = pd.Series([5.5,6.0,-1.8,4.4],index=['a','b','c','d'])
print(s2)
#输出结果
#a 5.5
#b 6.0
#c -1.8
#d 4.4
#dtype: float64
可以使用pandas.value和pandas.index来输出所创建的Series的值和索引,我们以所创建的s1为例
s1.values#series的值
#输出结果
#array([ 5, -7, 3, 2], dtype=int64)
s1.index#series的索引
#输出结果
#RangeIndex(start=0, stop=4, step=1)
下面讲解通过索引值查找值
s2['a']#根据索引取值
#输出结果:5.5
s2[['a','b','c']]#根据索引取值
#输出结果
#a 5.5
#b 6.0
#c -1.8
#dtype: float64
此外,也可以判断某个索引是否在所创建的Series中
'b' in s2
#输出结果:True
'e' in s2
#输出结果:Flase
由此可以看出,Series可以看作是一个定长且有序的字典,我们也可以把字典直接赋给Series
dic1 = {'fish':8,'dog':7,'cat':12}
s3 = pd.Series(dic1)
print(s3)
#输出结果
#fish 8
#dog 7
#cat 12
#dtype: int64
2.DataFreme
如下所示,DataFrame就是根据所给的数据生成一个表格,它包含行索引(name,income,pay)和列索引(这里由于没有给定,系统会用0 1 2 3 4的正常顺序代替)
再举一个例子,下方为用numpy.arrange()方法再通过reshape函数生成3行5列的dataframe数据,行索引和列索引缺少则系统自动填上。
可以自己指定行索引和列索引,如下
df3 = pd.DataFrame(np.arange(15).reshape((3,5)),index=['a','c','b'],columns=[1,3,4,2,5])
print(df3)
输出结果为
可以通过方法来输出列索引,行索引和值,如下以df1为例
下面介绍一个函数,descibe()函数,它可以返回数据结构的统计变量。如下
count:数量统计,此列共有多少有效值; mean:均值; std:标准差; min:最小值; 25%:四分之一分位数; 50%:二分之一分位数; 75%:四分之三分位数; max:最大值。
dataframe的转置。将字典的键值赋值给dataframe时,将键作为行索引,转置后将键作为列索引
下面介绍 关于dataframe列排序和行排序
利用pandas.sort_index(axis=i)函数,并通过改变axis的值来确定是行排序还是列排序
排序就是根据大小比较来改变顺序
按指定值排序,下方是按2索引值排序,即以索引值为2的那一列中的数大小进行排序
(2)pandas选择数据
dates = pd.date_range('20210101',periods=6)#data_range按顺序生成日期型
print(dates)
#输出结果
#DatetimeIndex(['2021-01-01', '2021-01-02', '2021-01-03', '2021-01-04',
# '2021-01-05', '2021-01-06'],
# dtype='datetime64[ns]', freq='D')
df1 = pd.DataFrame(np.arange(10,34).reshape((6,4)),index=dates,columns=
['A1','A2','A3','A4'])
print(df1)
输出结果:
下面通过索引获取数据(这是获取行索引或列索引中的值,区分df1.index df1.columns):
(1)通过输入列的索引来获取列数据
(2)通过切片的方法来获取行数据
(3)通过.loc方法(标签获取数据)
(4)通过.iloc方法(位置选取数据)
(7)通过>和<的关系判断获取
df1[df1.A1>6]是指将元素都大于6的行数据打印出来,这里由于所有数据都大于6,看不出差别,所以我们改一下数
未完待续。。。。。。。。。