1.介绍
????????身为一个库,就必然有它封装的函数,这一节我们将学习numpy中的函数。
2.函数
?2.1 数学函数
????????数学函数比较简单,只需简单的看一下即可,这儿不给例子。
函数名 | 作用 | 参数解读 | np.sin(x)/np.cos(x)/np.tan(x) | 正弦/余弦/正切 | x:一个变量 | np.arcsin(x)/np.arccos(x)/np.arctan(x) | 反正弦/反余弦/反正切 | x:一个变量 | np.degrees(x) | 弧度转角度 | x:角度变量 | np.around(x,decimals=0) | 四舍五入 | x:变量,decimals:保留的小数位 | np.floor(x) | 向下取整 | x:一个变量 | np.ceil(x) | 向上取整 | x:一个变量 | np.add(a,b) | 等同于a+b | a,b两个变量 | np.subtract(a,b) | 等同于a-b | a,b两个变量 | np.multiply(A,B) | 矩阵相乘 | A,B两个矩阵 | np.divide(a,b) | 等同于a/b | a,b两个变量 | np.power(x,n) | n方运算 | x的n次方 | np.mod(a,b) | 等同于a%b | a,b两个变量 |
?2.2 统计函数
? ? ? ? 从统计函数开始,这些函数就比较重要了,先总结一下函数,后给出例子。
? ? ? ? 值得一题的是,numpy中 axis参数代表轴,当axis=0时,表示按列做某种操作,当axis=1时,表示按行做某种操作,axis=2,按第三通道...........
? ? ? ? 也可以如此理解,如果有一个(m*n*a*b....)的矩阵,当axis=0,得到(n*a*b)矩阵;当axis=1,得到(m*a*b)的矩阵;当axis=2时,得到(m*n*b)的矩阵……
函数名 | 作用 | 参数解读 | np.amin(ndarray,axis) | 按axis轴寻找最小值 | 当axis不指定时,返回一个最小值,否则按axis轴找最小值 | np.amax(ndarray,axis) | 按axis轴寻找最大值 | 当axis不指定时,返回一个最大值,否则按axis轴找最大值 | np.ptp(ndarray,axis) | 返回最大值与最小值得差 | 当axis不指定时,返回一个极差,按axis轴找极差 | np.median(ndarray,axis) | 求中位数 | ............................................ | np.mean(ndarray,axis) | 求平均数 | ............................................. | np.average(ndarray,axis) | 求加权平均值 | ............................................. | np.std(ndarray,axis) | 求标准差 | 公式为:std = sqrt(mean((x - x.mean())**2)) | np.var(ndarray,axis) | 求方差 | 公式:var=mean((x - x.mean())** 2) | np.max(ndarray,axis) | ==np.amax(ndarray,axis) | | np.min(ndarray,axis) | ==np.amin(ndarray,axis) | |
我们可以上个小应用,可以实现这样的一个函数,输入的ndarray数据,求统计上的变量,如可以求【均值,方差,标准差,中位数,最大值,最小值,偏度,峰度】
上代码:?
import numpy as np
def deal_data(values, label,axis=None):
"""
计算 【均值,方差,标准差,中位数,最大值,最小值,偏度,峰度】
input:
values : ndarray数据 m*n
label : ['mean', 'var', 'std', 'median', 'max', 'min', 'skewness', 'kurtosis']中的一个
axis : 0 or 1 or None if axis = 0,每列为1个数据,if axis = 1 ,每行为1个数据
return : 计算什么返回什么
"""
labels = ['mean', 'var', 'std', 'median', 'max', 'min', 'skewness', 'kurtosis']
if label not in labels:
raise Exception('label不合理,没有相应的计算方式')
else:
axes = [None,0,1]
if axis not in axes:
raise Exception('axis参数不合理,应为None、0、1')
if label == 'mean':
values = np.mean(values, axis=axis)
elif label == 'var':
values = np.var(values, axis=axis)
elif label == 'std':
values = np.std(values, axis=axis)
elif label == 'median':
values = np.median(values, axis=axis)
elif label == 'max':
values = np.max(values, axis=axis)
elif label == 'min':
values = np.min(values, axis=axis)
elif label == 'skewness':
mean = np.mean(values, axis=axis)
vars = np.var(values, axis=axis)
if axis is not None:
mean = np.expand_dims(mean,axis=axis)
fenzi = np.mean((values - mean) ** 3,axis=axis)
fenmu = vars**1.5
values = fenzi / fenmu
elif label == 'kurtosis':
vars = np.var(values, axis=axis)
mean = np.mean(values, axis=axis)
if axis is not None:
mean = np.expand_dims(mean,axis=axis)
fenzi = np.mean((values - mean) ** 4, axis=axis);
fenmu = vars ** 2;
values = fenzi / fenmu
return values
a = np.array([[10,14,6],[14,20,7],[9,4,23]])
values=deal_data(a,label='kurtosis',axis=0)
2.3 排序
? ? ? ? 排序有很多方式,评判一个排序,得看其时间复杂度,空间复杂度,稳定性等总结成下表
? ? ? ? 函数为:np.sort(ndarray, axis, kind, order)
种类(kind) | 速度 | 稳定性 | 最坏情况 | 'quicksort' (快速排序) | 1 | 否 | O(n^2) | 'mergesort' (归并排序) | 2 | 是 | O(n*logn) | 'heapsort' (堆排序) | 3 | 否 | O(n*logn) |
其中参数kind:默认为快速排序,order:按什么排序。
相关的排序,获得索引的函数有:
函数名 | 作用 | np.sort(ndarray, axis, kind, order) | 升序 | np.argsort(ndarray,axis) | 返回升序数组对应的索引(原数组不改变) | np.argmax(ndarray,axis) | 返回axis轴最大值的索引 | np.argmin(ndarray,axis) | 返回axis轴最小值的索引 | np.nonzero(ndarray) | 返回1个tuple,大小为ndarray.dim,将这些数组每个维度对应可以获得一组坐标,这些坐标就是非0值得索引 | np.where(条件如ndarray>0) | 返回ndarray满足条件的索引,如果是多维数组,相当于对每个指针进行操作,会获得1个tuple,大小为ndarray.dim,即满足条件的坐标为(x,y,....) | np.extract(条件,ndarray) | 返回ndarray满足条件的值 |
上例子:
import numpy as np
a = np.array([[4,0,3],[6,3,0]])
b = np.sort(a,kind='quicksort',axis=0)
print(b)
c = np.argsort(a,axis=0)
d = np.argmax(a,axis=0)
print('c={}\nd={}'.format(c,d))
f,g = np.nonzero(a) #因为a有两个维度,返回大小为2的tuple
#获得非0元素的个数
nonzero_nums = np.size(f)
#用where语句求0元素的个数
nonzero_nums_ = np.size(np.where(a==0)[0])
#extract求a>3的元素
a_lager_3 = np.extract(a>=3,a)
给点小运用
(1).ndarray 按行排序:实现1个这样的行数,它可以根据某一列作为关键字,按行排序
import numpy as np
def sort_rows(arr,col=0):
"""
按行排序,默认按第1列排序
"""
index = np.argsort(arr,axis=0)[:,col]
values = arr[index]
return values
a = np.array([[4,21,23],[1,30,22],[3,1,12]])
b = sort_rows(a,col=0) #按第1列排序
print(b)
(2).大家知道 np.sort是升序操作,那我们可以实现降序的操作。
具体操作是 对1个ndarray对象取符号,后升序获得索引,在引用
import numpy as np
a = np.array([4,21,23,1,30,22,3,1,12])
index = np.argsort(-a)
a_ = a[index]
print(a_)
?2.4 矩阵生成
? ? ? ? 这一部分就是关于对矩阵的创建的一些函数。
函数名 | 作用 | np.random.seed(n) | 将随机数分成n个堆,产生固定的随机数顺序 | np.random.rand(d1,d2,d3...) | 生成大小为(d1,d2,...),值为0-1均匀分布的随机数 | np.random.randn(d1,d2,d3...) | 生成大小为(d1,d2,...),值为0-1正态分布的随机数 | np.random.randint(low,high,size) | 生成大小为size(元组),值为[low,high)的随机整数 | np.random.uniform(low,high,size) | 生成大小为size(元组),值为[low,high)的随机浮点数 | np.ones(size) | size:元组 ,产生size大小的为1的矩阵 | np.eyes(m,n) | 产生m行n列的单位矩阵 | np.empty(size) | size:元组 , 不推荐使用,次函数使用不为空矩阵,有极小的误差! |
|