数据分析系列 之python中拓展库SciPy的使用

Posted 琅晓琳

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据分析系列 之python中拓展库SciPy的使用相关的知识,希望对你有一定的参考价值。

1 概述:
SciPy中的数据结构:
ndarray(N维数组)
Series(变长字典)
DataFrame(数据框)

常用的库:
NumPy:强大的ndarray对象和ufunc函数,比较适合线性代数和随机数处理等科学计算,具有有效的通用多维数据,可定义任意数据类型,无缝对接数据库。
Matplotlib:基于NumPy,是一个二维绘图库,可快速生成曲线图、直方图、散点图等形式的图。
pandas:基于SciPy和NumPy,具有高效的Series和DataFrame数据结构,具备高效的处理大数据集的切片功能,可提供优化库功能读写多种文件格式,如csv、hdf5等。

2 ndarray:
介绍:
维度(dimensions)称为轴(axis),轴的个数称为秩(rank)。

基本属性:
秩:ndarray.ndim
维度:ndarray.shape
元素总个数:ndarray.size
元素类型:ndarray.dtype
元素字节大小:ndarray.itemsize

通用函数:
ufunc函数—>是一种能对数组的每个元素进行操作的函数。很多是在C语言级别实现,计算速度比math快。

举例:

import numpy as np
aArray = np.array([(1,2,3),(4,5,6)])
输入:aArray
输出:array([(1,2,3),
			(4,5,6)])
			
bArray = np.linspace(1,2,5,endpoint=False)
输入:bArray
输出:[1.  1.2 1.4 1.6 1.8]

cArray = np.linspace(1,49,25,dtype=int)
输入:print(cArray)
输出:[ 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 49]

dArray = np.linspace(1,49,25,dtype=int)
输入:print(dArray)
输出:[ 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39 41 43 45 47 50]

#生成9*9的乘法口诀表
np.fromfunction(lambda i,j:(i+1)*(j+1),(9,9))

#选择列和行的数据
import numpy as np
x = np.array([[1,2,3],[4,5,6],[7,8,9]])
#选择第一列和第三列数据
print(x[:,[0,2]])
[[1 3]
 [4 6]
 [7 9]]
#选择第一行和第三行
print(x[::2])
[[1 2 3]
 [7 8 9]]
#选择第一列和第三列
print(x[:,::2])
[[1 3]
 [4 6]
 [7 9]]
#交换行
print(x[::-1])
[[7 8 9]
 [4 5 6]
 [1 2 3]]
#交换列
print(x[:,::-1])
[[3 2 1]
 [6 5 4]
 [9 8 7]]

#用函数改变
import numpy as np
x = np.array([[1,2,3],[4,5,6]])
#由两行三列变成三行两列
y = x.reshape(3,2)
或者:y = x.reshape(3,-1)
print(y)
[[1 2]
 [3 4]
 [5 6]]
print(x)
[[1 2 3]
 [4 5 6]]
#如果真正改变x?
x.resize(3,2)

x = np.array([1,2,3])
y = np.array([4,5,6])
#垂直方向上拼接
np.vstack((x,y))
[[1 2 3]
 [4 5 6]]
#水平方向上拼接 
np.hstack((x,y))
[1 2 3 4 5 6]

x = np.array([1,2,3])
y = np.array([[4,5,6],[7,8,9]])
#广播,x拓展
print(x+y)
[[ 5  7  9]
 [ 8 10 12]]

y = np.array([[4,5,6],[7,8,9]])
#沿列求和
print(y.sum(axis=0))
[11 13 15]
#沿行求和
print(y.sum(axis=1))
[15 24]
#最小值
print(y.min())
4
#最大值9的index
print(y.argmax())
5
#方差
print(y.var())
2.9166666666666665
#标准差
print(y.std())
1.707825127659933

x = np.array([[1,2],[3,4]])
#行列式
print(np.linalg.det(x))
-2.0000000000000004
#逆矩阵
print(np.linalg.inv(x))
[[-2.   1. ]
 [ 1.5 -0.5]]
#矩阵内积
print(np.dot(x,x))
[[ 7 10]
 [15 22]]

3 Series:
介绍:
类似于一维数组的对象,由数据和索引组成。

举例:

import pandas as pd
aSer = pd.Series(['A','B','C'],index=[1,2,3])
print(aSer)
#自带索引
1    A
2    B
3    C

x = {'A':1,'B':2,'C':3,'D':4}
y = ['A','B','C','D','E']
aSer = pd.Series(x,index=y)
#数据对齐
print(aSer)
A    1.0
B    2.0
C    3.0
D    4.0
E    NaN
dtype: float64
print(pd.isnull(aSer))
A    False
B    False
C    False
D    False
E     True
dtype: bool

4 DataFrame:
介绍:
二维表结构,含有一组有序的列,大体上可以看作共享一个index的Series集合。

import numpy as np
import pandas as pd
data = np.array([('A',1),('B',2),('C',3)])
frame = pd.DataFrame(data,index=range(1,4),columns=['Ac','Bc'])
print(frame)
   Ac Bc
1  A  1
2  B  2
3  C  3

#行索引
print(frame.index)
RangeIndex(start=1, stop=4, step=1)
#列索引
print(frame.columns)
Index(['Ac', 'Bc'], dtype='object')
#值
print(frame.values)
[['A' '1']
 ['B' '2']
 ['C' '3']]

#代表第0和1行的第1列
print(frame.iloc[:2,1])
1    1
2    2
Name: Bc, dtype: object

#对指定列进行修改
frame['Ac']='D'
print(frame)
   Ac Bc
1  D  1
2  D  2
3  D  3

#删除某一列
del frame['Ac']

#统计功能
name	pay
ABC		1000
DEF		2000
HIJ		3000
frame.pay.min()
1000
#运用矢量计算,比用for循环快
frame[frame.pay>=2000]
name	pay
DEF		2000
HIJ		3000

5 应用:基于字典做词频统计

poem = 'ABC DEF HIJ,ABC.'
poem_list = poem.split()
p_dict = {}
for item in poem_list:
	if item[-1] in ',.\\'"':
		item = item[:-1]
	if item not in p_dict:
		p_dict[item] = 1
	else:
		p_dict[item] += 1
print(p_dict)
{'ABC': 1, 'DEF': 1, 'HIJ,ABC': 1}

6 应用:如何创建一个边界值为1,内部值为0的二维数组

import numpy as np
x = np.ones((5,5))
x[1:-1,1:-1] = 0
print(x)
[[1. 1. 1. 1. 1.]
 [1. 0. 0. 0. 1.]
 [1. 0. 0. 0. 1.]
 [1. 0. 0. 0. 1.]
 [1. 1. 1. 1. 1.]]

#可以包含全0和全1的数组
x = np.full((5,5),np.pi)
print(x)
[[3.14159265 3.14159265 3.14159265 3.14159265 3.14159265]
 [3.14159265 3.14159265 3.14159265 3.14159265 3.14159265]
 [3.14159265 3.14159265 3.14159265 3.14159265 3.14159265]
 [3.14159265 3.14159265 3.14159265 3.14159265 3.14159265]
 [3.14159265 3.14159265 3.14159265 3.14159265 3.14159265]]

#创建一个单位数组
x = np.eye(4)
print(x)
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
 #对角线上移一层
x = np.eye(4,k=1)
print(x)
[[0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]
 [0. 0. 0. 0.]]

#布尔索引
np.where(x % 2 == 0, -1, x)

7 应用:矢量化和广播思想的应用

score = np.array([[1,2,3],[4,5,5]])
#把二维数组转成了一维数组
score_mean = score.mean(axis=1)
print(score)
score - score_mean
ValueError: operands could not be broadcast together with shapes (2,3) (2,) 
#需要将keepdims设置为true,才可以正常广播
score_mean = score.mean(axis=1,keepdims=True)
print(score)
print(score - score_mean)
[[-1.          0.          1.        ]
 [-0.66666667  0.33333333  0.33333333]]

参考资料:
https://www.icourse163.org/learn/NJU-1001571005?tid=1463102441&from=study#/learn/content?type=detail&id=1240380185&sm=1 用python玩转数据

以上是关于数据分析系列 之python中拓展库SciPy的使用的主要内容,如果未能解决你的问题,请参考以下文章

Python系列之Python机器学习应用 北理工MOOC

『Python』Numpy学习指南第十章_高端科学计算库scipy入门(系列完结)

Python机器学习入门之导学+无监督学习

Python数学建模系列:规划问题之整数规划

Python数学建模系列:规划问题之线性规划

微信小程序 MinUI 组件库系列之 icon 图标组件