利用Python进行数据分析学习笔记
纸上得来终觉浅,绝知此事要躬行!
通用函数
Numpy通用函数,ufunc,是对ndarray数据执行元素级运算的函数,一般都是简单元素级变体,如sqrt和exp、add和maximum。
import numpy as np
a1=np.arange(2,9,1.5)
a2=[np.sqrt(a1),np.exp(a1)]
# a2=[array([ 1.41421356, 1.87082869, 2.23606798, 2.54950976, 2.82842712]), \
# array([ 7.3890561 , 33.11545196, 148.4131591 , 665.14163304,2980.95798704])]
add:将数值中的对应元素相加; vstack:数组垂直组合;hstack:数组水平组合
np.add(np.sqrt(a1),np.exp(a1))
# array([ 8.80326966, 34.98628065, 150.64922708, 667.6911428 ,2983.78641417])
np.vstack((np.sqrt(a1),np.exp(a1)))
# array([[ 1.41421356e+00, 1.87082869e+00, 2.23606798e+00,
# 2.54950976e+00, 2.82842712e+00],
# [ 7.38905610e+00, 3.31154520e+01, 1.48413159e+02,
# 6.65141633e+02, 2.98095799e+03]])
np.hstack((np.sqrt(a1),np.exp(a1)))
# array([ 1.41421356e+00, 1.87082869e+00, 2.23606798e+00,
# 2.54950976e+00, 2.82842712e+00, 7.38905610e+00,
# 3.31154520e+01, 1.48413159e+02, 6.65141633e+02,2.98095799e+03])
利用数组进行简单数据处理
1.以矢量化运算代替循环语句
meshgrid()接受2个一维数组,产生2个二维矩阵(对应于2个数组中所有的(x,y)对)
np.meshgrid(range(-2,3,1),range(2,-3,-1))
'''
[array([[-2, -1, 0, 1, 2],
[-2, -1, 0, 1, 2],
[-2, -1, 0, 1, 2],
[-2, -1, 0, 1, 2],
[-2, -1, 0, 1, 2]]),
array([[ 2, 2, 2, 2, 2],
[ 1, 1, 1, 1, 1],
[ 0, 0, 0, 0, 0],
[-1, -1, -1, -1, -1],
[-2, -2, -2, -2, -2]])]
'''
2.将条件逻辑表述为数组运算
where()是三元表达式x if condition else y 的矢量化版本。
import numpy as np
a1=np.random.randn(4,4)
a2=np.where(a1>0,1,-1)
[a1,a2]
'''
[array([[-0.8706278 , 0.0237752 , -0.99088391, 2.83025983],
[ 0.14434257, 0.46890902, -0.04495302, 0.34565242],
[-1.23190889, 2.46150353, -1.04977117, 1.11144464],
[-0.34056044, 1.92221497, -0.20429243, -1.58721302]]),
array([[-1, 1, -1, 1],
[ 1, 1, -1, 1],
[-1, 1, -1, 1],
[-1, 1, -1, -1]])]
'''
3.数学和统计方法
可以通过数组上的一组数学函数对整个数组或某个轴向的数据进行统计分析。sum、mean、std等聚合计算既可以当作数组的实例方法调用,也可以当作顶级Numpy函数使用:
a3=np.random.randn(5,4)
a3.mean()
[a3.sum(),a3.sum(0),a3.sum(1)]
'''
-0.016256698097642252
[-0.32513396195284505,
array([ 1.26495619, 0.66067243, -1.5200986 , -0.73066398]),
array([-1.20911137, 1.05979398, 0.89817777, 0.20638696, -1.2803813 ])]
'''
方法 | 说明 |
sum | 对数组中全部或某轴向的元素求和 |
mean | 算术平均数 |
std、var | 标准差、方差 |
min、max | 最小最大值 |
argmin、argmax | 最小、最大元素索引 |
cumsum | 所有元素累计和 |
cumprod | 所有元素累计积 |
4.用于布尔型数组的方法
布尔值在统计方法中会强制转换为0(flase)、1(true)。利用sum可以对布尔型数组计数:
(np.random.randn(50)>0).sum()
方法any用于测试数组中是否存在true,all检查数组中是否全是true。
5.排序
sort方法就地排序:
a1=np.random.randn(3,4)
print(a1)
a1.sort(1)
print(a1)
a1.sort(0)
print(a1)
'''
[[ 0.71182775 0.07219067 0.03180469 -0.92782231]
[-0.81696553 0.53741266 0.69825186 1.0744595 ]
[ 1.43357465 0.94246017 -1.36653131 0.88005336]]
[[-0.92782231 0.03180469 0.07219067 0.71182775]
[-0.81696553 0.53741266 0.69825186 1.0744595 ]
[-1.36653131 0.88005336 0.94246017 1.43357465]]
[[-1.36653131 0.03180469 0.07219067 0.71182775]
[-0.92782231 0.53741266 0.69825186 1.0744595 ]
[-0.81696553 0.88005336 0.94246017 1.43357465]]
'''
6.唯一化以及其它集合逻辑
Numpy提供了针对一维数组ndarray的基本集合运算。np.unique()用于找出数组中的唯一值并返回已排序的结果,效果类似于sorted(set(names))
names=np.array(["zhao","qian","li","zhao","sun"])
np.unique(names)
'''
array(['li', 'qian', 'sun', 'zhao'],
dtype='<U4')
'''
np.in1d()用于测试一个数组的值在另一个数组中的成员资格,返回一个布尔值数组。
方法 | 说明 |
unique(x) | 计算x中的唯一元素,并返回有序结果 |
intersect1d(x,y) | 计算x、y中的公共元素,并返回有序结果 |
union1d(x,y) | 计算x、y的并集,并返回有序结果 |
in1d(x,y) | 得到一个“x的元素是否包含于y”的布尔型数组 |
setdiff1d(x,y) | 集合的差:元素在x中且不在y中 |
setxor1d(x,y) | 集合的对称差:存在于单个数组中但不同时存在于两个数组中的元素 |