python内置函数、numpy数据处理方法记录

最近在看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:调用函数的关键字参数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值