您的位置:首页 > 编程语言 > Python开发

机器学习(3)-一些常用的Python3.0函数

2017-09-18 15:30 519 查看
在这里记载一下我处理图片数据集时候,遇到一些函数;

max()和argmax()

max是Python的内置函数,而argmax()是numpy的调用函数。

A:是一个[m*n]的矩阵

max(A),求出矩阵A中的最大值

这里的A应该是一个n*1的矩阵。

B:B[m,n]矩阵

argmax(),就是求出矩阵最大元素的索引,比如下面的A矩阵,求出就是np.argmax(A)=4,np.argmax(B)=7,

下面这段代码是求矩阵中最大元素的位置:

import numpy as np
A = np.mat([[1,2,3],[4,6,5]])
B= np.array([[1,2,3,4],[2,3,1,5]])

print ('max:',np.argmax(A))

row,column = np.shape(A)

print(row,column)

m, n = divmod(np.argmax(A), column)

print (A[m,n])
print (max(A))#这句话报错,因为A矩阵不是一行


2.divmod()

这是一个Python内置函数:

用法见上面一段代码,输出返回两个参数。

sort(),sorted()和argsort()

sort()和sorted()区别很大:

首先是排序对象:sort函数是list列表中的函数,而sorted可以对list或者iterator进行排序。

下面就是用sorted()对list的排序。

注意函数形式为:sorted(iterable,cmp,key,reverse)

cmp是带两个参数的比较函数;

key 是带一个参数的函数;

reverse为False或者True;

>>> list1 = [('david', 90), ('mary',90), ('sara',80),('lily',95)]
>>> sorted(list1,cmp = lambda x,y: cmp(x[0],y[0]))
[('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]
>>> sorted(list1,cmp = lambda x,y: cmp(x[1],y[1]))
[('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]

>>> list1 = [('david', 90), ('mary',90), ('sara',80),('lily',95)]
>>> sorted(list1,key = lambda list1: list1[0])
[('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]
>>> sorted(list1,key = lambda list1: list1[1])
[('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]


然后是排序效果:用sort函数对列表排序时会影响列表本身,而sorted不会.所以使用两者需注意。

>>> a = [1,2,1,4,3,5]
>>> sorted(a)
[1, 1, 2, 3, 4, 5]
>>> a
[1, 2, 1, 4, 3, 5]
>>> a.sort()
>>> a
[1, 1, 2, 3, 4, 5]


然后是np.argsort():

argsort函数返回的是数组值从小到大的索引值

get()

get()函数是对字典的一种操作。

get()的语法:dict.get(key, default=None)

就是根据字典的键值获取对应的键值

dict = {'Name': 'Zara', 'Age': 27}

print ("Value : %s" %  dict.get('Age'))
>>>Value :27
print "Value : %s" %  dict.get('Sex', "Never")#Sex不是字典中的键
>>> Value: Never


4.flatnonzero()

注意:这个函数的输入可以是多维的数组,返回值是数组中非零元素的索引。

同样功能的函数可见nonzero(),只是返回的是两个数组,一个装的是非零元素的行,一个装的是非零元素的列。

5.enumerate()

enumerate()是枚举的意思,也是Python的内置函数。

注意enumerate的操作对象是字典或者list。

具体用法见下面截图:



6.random.choice(),random.sample()

注意,使用时候引入 import random

语法:random.choice( seq ):seq – 可以是一个列表,元组或字符串。

list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
slice = random.sample(list, 5)  #从list中随机获取5个元素,作为一个片断返回
print slice
print list #原有序列并没有改变。


import random
print (random.choice((1,2,3)))
>>>1
print (random.choice('rand'))
>>>r


7.random.rand()

语法:np.random.rand(m,n),用法和上面不太一样。加了np.

用于残生一个元素值均匀分布在[0,1]的矩阵

print (np.random.rand(3,3))


8.shape()

A.shape:返回的一个一维数组,里面就是是A矩阵的维度,行数,列数信息。

举例子:

a = np.arange(3*4*5).reshape(3,4,5)
print (a.shape)//也可以写成print(np.shape(a))
print (a.shape[0])
print (a.shape[1])
print (a.shape[2])
>>>(3,4,5)
>>>3
>>>4
>>>5


A.shape[0]:根据上面代码,返回描述矩阵的第一个信息,就是.shape()返回值的第一个元素

A.shape[1]:。。。。。第二个元素

9.reshape()

reshape(a,m,n):将一个矩阵变为一个有a维,每个维度都是一个m×n的矩阵。

也可以直接用reshape(m,n)

应用见上面一个函数的距离,在图像中用于将图像变为行向量,处理完成后,变换为图像矩阵显示。

10.bincount()

用途:用于统计索引出现的次数。有点抽象吧,看下面代码例子

第一种形式;bincount(x)

x = np.array([0, 1, 1, 3, 2, 1, 7])
# 我们可以看到x中最大的数为7,因此bin的数量为8,那么它的索引值为0->7(先不管x是怎么来的,把里面的元素看成普通的数,这里面的索引就是指这些数)

# 索引0出现了1次,索引1出现了3次......索引5出现了0次......
np.bincount(x)
#因此,输出结果为:array([1, 3, 1, 1, 0, 0, 0, 1])

下面谈谈x形成的一种来源:输入一张图片,与样本中的图片(m张,共有4类-猫,猪,狗,鸡)计算距离,就会得到一个1×m的矩阵,然后根据矩阵的元素值(也就是图片间的距离)从小到大排序,从这m个从小到大的元素中取出前k个,作为输入图片的最近邻。这前k个元素(假设k=5)是原来m中第1,5,7,8,9张图片。则对应的分类为(y[1],y[5],y[7],y[8],y[9]),对应的类为(1,2,1,4,1)
这个(1,2,1,4,1)就是上面的x。
通过np.bincount(x)后,得到[(0,3,1,0,1)],于是得到x中索引1出现了3次。这个索引就是图片的类别。   这个“索引”可以这样理解,为第i张图片对应的类别y[i](y[1]只可能是1,2,3,4),就是在4个类别中索引.应该明白了吧,哈哈。


其实bincount(x,weight = None,minlength =None)对后面两个参数理解,见下图



11.sum()

看代码就理解了

c = np.array([[2, 1], [5, 6], [ 1, 1]])

print c.sum()
>>>16
print c.sum(axis=0)#每一列的和
>>>[8,8]
print c.sum(axis=1)#每一行的和
>>>[3,11,2]


12.add()

python 集合的添加有两种常用方法,分别是add和update。

add也可以矩阵相加

13.hstack(),vstack()

一种用于组合不同数组的函数

用法见代码

>>> a = floor(10*random.random((2,2)))
>>> a
array([[ 1.,  1.],
[ 5.,  8.]])
>>> b = floor(10*random.random((2,2)))
>>> b
array([[ 3.,  3.],
[ 6.,  0.]])
>>> print (np.vstack((a,b)))
array([[ 1.,  1.],
[ 5.,  8.],
[ 3.,  3.],
[ 6.,  0.]])
>>> print (np.hstack((a,b)))
array([[ 1.,  1.,  3.,  3.],
[ 5.,  8.,  6.,  0.]])


14.squeeze()

函数功能:除去size为1的维度

B = squeeze(A),B与A有相同的元素,但所有只有一行或一列的维度(a singleton dimension)被去除掉了

如果没有一行或者一列,不改变矩阵任何信息。

a = np.random.rand(4,1,3)
print (a)
print (np.squeeze(a))


结果为



15.range()和np.arange()

range()不支持步长为小数,np.arange()支持步长为小数
两者都有三个参数,以第一个参数为起点,第三个参数为步长,截止到第二个参数之前的不包括第二个参数的数据序列
某种意义上,和STL中由迭代器组成的区间是一样的,即"左闭右开"的区间。[first, last)或者不加严谨地写作[first:step:last)

>>>for  i in range(1, 5):
...    print(i)
1
2
3
4

>>> np.arange(1, 5)
array([1, 2, 3, 4])

>>>np.arange(1, 5, .5)
array([ 1. ,  1.5,  2. ,  2.5,  3. ,  3.5,  4. ,  4.5])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  python 机器学习