最近在看sklearn上KNN 分类算法的源码,遇到了许多新的、没掌握的数据处理函数,整理下来记录一下。
python内置函数
矩阵乘法 A @ B
在python3.5 以后的版本中,@符号有两种含义:表示修饰符;表示矩阵乘法。此处介绍作为矩阵乘法的使用。
a = np.array([[1,2,3,4],[5,6,7,8]])
b = np.array([2,2,2,2])
print(a@b)
[20 52]
补充:
A*B:矩阵与矩阵对应元素相乘
A.dot(B) 或 np.dot(A,B):矩阵相乘
zip
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
a = [1,2,3]
b = [4,5,6]
c = [4,5,6,7,8]
zipped = zip(a,b) # 压缩两个等长度的列表
for i in zipped:
print(i)
(1, 4)
(2, 5)
(3, 6)
zipped1 = zip(a,c) # 压缩两个长度不等的列表,元素个数与最短的列表一致
for i in zipped1:
print(i)
(1, 4)
(2, 5)
(3, 6)
unzip = zip(*zipped) # 解压,可以注意到,压缩前是列表,经过压缩再解压已经转换成了元组
for i in unzip:
print(i)
(1, 2, 3)
(4, 5, 6)
numpy
np.einsum()
爱因斯坦求和公式
参见:https://blog.csdn.net/zhaohongfei_358/article/details/125273126,这篇文章将的比较透彻。
np.maximum()、np.minimum()
numpy.maximum()函数用于查找数组元素的逐元素最大值。
numpy.maximum(arr1, arr2, /, out=None, *, where=True, casting=’same_kind’, order=’K’, dtype=None, ufunc ‘maximum’)
arr1 :[数组]输入数组。
arr2 :[数组]输入数组。
out :[ndarray,可选]将结果存储到的位置。
->如果提供,则必须具有广播输入的形状。
->如果未提供或没有,则返回新分配的数组。
**kwargs:允许您将关键字的可变参数长度传递给函数。当我们要处理函数中的命名参数时使用它。
where :[数组,可选] True值表示在该位置计算通用函数(ufunc),False值表示将值保留在输出中。
Return :[ndarray或标量]结果。
a = np.array([2,23,564])
b = np.array([4,32,44])
c = np.maximum(a,b) # 两个array比较,将结果给变量c
c
Out[17]: array([ 4, 32, 564])
np.maximum(a,b,out=b) # 两个array比较,将结果输出给b
b
Out[19]: array([ 4, 32, 564])
np.maximum(a,10,out=a)# array 和标量比较,结果输出给a
a
Out[21]: array([ 10, 23, 564])
# 还可以两个列表进行比较,若要用out指定输出,则输出对象必须是array
np.minimum()用法类似,可参考使用。
np.argpartition()
argpartition()函数划分重组数组,返回的是重组后数据的索引数组。
其中参数:
a是numpy数组
kth是从小到大第kth
numpy.argpartition(a, kth, axis=-1, kind=‘introselect’, order=None)
x = np.array([3, 4, 2, 1])
np.argpartition(x, 3)
Out[6]: array([2, 3, 0, 1], dtype=int64) # 此处的数组是下标数组
x[np.argpartition(x,3)]
Out[7]: array([2, 1, 3, 4]) # 此处是排序后的原始数组,可以看到下标为3的元素排序正确,且下标在3之前的元素小于该元素
x[np.argpartition(x,2)]
Out[8]: array([1, 2, 3, 4]) # 下标为2的元素排序正确,且左边小于该元素,右边大于该元素
若要取数组a的前5个最小值,可以写为a[np.argpartition(a,5)][:5];
若要取数组a的前5个最大值,可以写为a[np.argpartition(a,-5)][-5:];
np.argsort()
argsort() 函数是对数组中的元素进行从小到大排序,并返回相应序列元素的数组下标。
a = np.array([1,4,2,5,3,6,7])
a.argsort()
Out[16]: array([0, 2, 4, 1, 3, 5, 6], dtype=int64)
a[a.argsort()]
Out[17]: array([1, 2, 3, 4, 5, 6, 7])
np.take()
沿轴从数组中获取元素。
np.take(a, indices, axis=None, out=None, mode='raise')
a = np.array([[1,2,4,([1,2,6])],
[3,2,6,([6,5,1])],
[6,9,4,([3,7,5])]], dtype=object)
print(a.take(indices=2,axis=0)) # indices=2,取下标为2的列;axis=0 按行; axis=1 按列 (二维数组,so,只能取0或1)
Out[14]: array([6, 9, 4, list([3, 7, 5])], dtype=object)
np.vstack()、np.hstack()
用作数据拼接,不过拼接维度不同。
vstack进行行拼接,要求数据有相同的列数。
hstack进行列拼接,要求数据有相同的行数。
a = np.array([1, 2, 3])
b = np.array([11, 22, 33])
np.vstack((a, b))
Out[8]:
array([[ 1, 2, 3],
[11, 22, 33]])
np.hstack((a, b))
Out[7]: array([ 1, 2, 3, 11, 22, 33])
np.ravel()
将数组维度拉成一维数组
a = np.array([[1,2,3],[4,2,3]])
a.ravel()
Out[11]: array([1, 2, 3, 4, 2, 3])
np.newaxis
增加新的维度。
x[:, np.newaxis] ,放在后面,会给列上增加维度
x[np.newaxis, :] ,放在前面,会给行上增加维度
x = np.array([1, 2, 3, 4])
print(x.shape)
(4,)
x_add = x[:, np.newaxis]
print(x_add.shape)
(4, 1)
print(x_add)
[[1]
[2]
[3]
[4]]
x2 = x[np.newaxis,:]
print(x2.shape)
(1, 4)
print(x2) # x2从一维变成了二维
[[1 2 3 4]]
scipy
stats.mode()
统计数组中的众数,和对应的出现次数。
from scipy import stats
import numpy as np
data = np.array([1,2,2,3,3,3,4,4,4,4])
mode_value = stats.mode(data)
print(mode_value)# 输出结果分为两部分,众数,和对应的次数
ModeResult(mode=array([4]), count=array([4]))
注:不知道为什么,当我用的数组有多个众数时,也只会输出一个众数。
pdist()
距离计算函数。
from scipy.spatial.distance import pdist, squareform
参数:
X:n维空间中包含m个原始观测值的m × n数组。
metric:字符串或函数,可选。用于计算距离的度量,可以是 ‘braycurtis’, ‘canberra’, ‘chebyshev’, ‘cityblock’, ‘correlation’, ‘cosine’, ‘dice’, ‘euclidean’, ‘hamming’, ‘jaccard’, ‘jensenshannon’, ‘kulsinski’, ‘mahalanobis’, ‘matching’, ‘minkowski’, ‘rogerstanimoto’, ‘russellrao’, ‘seuclidean’, ‘sokalmichener’, ‘sokalsneath’, ‘sqeuclidean’, ‘yule’。
返回:
Y:距离压缩矩阵。
from scipy.spatial.distance import pdist, squareform
import pandas as pd
df = pd.DataFrame({ 'A' : [0, 0, 1],
'B' : [2, 3, 4],
'C' : [5, 0, 1],
'D' : [1, 1, 0]},
columns= ['A','B', 'C', 'D'], index=['first', 'second', 'third'])
df
Out[8]:
A B C D
first 0 2 5 1
second 0 3 0 1
third 1 4 1 0
res = pdist(df, 'cityblock')
res # 输出是压缩矩阵,需要使用squareform还原为m × m的矩阵。
Out[12]: array([6., 8., 4.])
res1 = squareform(res)
res1
Out[14]:
array([[0., 6., 8.],
[6., 0., 4.],
[8., 4., 0.]])
其他
functools.partial
partial 作用:设置函数参数,返回新的函数,更加简单的调用这个函数。
from functools import partial
partial(func, *args, **kwargs) func 要调用的函数本身, args:调用函数所有不定长参数, kwargs:调用函数的关键字参数