Python的一些库和函数

Python的函数在定义的时候是不写参数类型的

def ChangeInt(a):
    a += 10
    return a

b = 2
b = ChangeInt(b)
print(b)

是def ChangeInt(a):   而不是def ChangeInt(a:int)

Python类在定义的时候括号内是父类名,如果没有继承父类就不用写

括号内不是写什么参数


class Animals():
    def breathe(self):
        print('breathing')
 
    def move(self):
        print('moving')
 
    def eat(self):
        print('eating food')
 
 
class Mammals(Animals):
    def breastfeed(self):
        print('feeding young')

reshape() / np.reshape()

X = X. reshape(a,b) 或 reshape((a,b)) 将 X矩阵reshape成a行b列,X原来必须也是a*b的

reshape()与resize()的作用基本相同,只有一点,如果给定的行列维度相等大于原数组,reshape会报错,而resize会copy原数组中的值对新数组进行填充

X = reshape(X.size, 1)

这句话的作用是,给X增添一维维度,如原本X是一维的,即一行,一个行向量,增添一维之后就会变成一列,一个列向量

就像newaxis的作用一样

import numpy as np

a = np.ones((3,5))
print(a)
a = a.reshape(5,3)
print(a)

Python的一些库和函数_第1张图片

python在程序运行中间打断点交互

import code

code.interact(local=locals())

python数据类型间的转换

字符串str与字节byte

b = b"example"    # bytes object  
s = "example"     # str object  
sb = bytes(s, encoding = "utf8")    # str to bytes 
或者:sb = str.encode(s)             # str to bytes 
bs = str(b, encoding = "utf8")      # bytes to str  
或者:bs = bytes.decode(b)           #  bytes to str 

Python collections.Counter()用法

什么是collections

       collections在python官方文档中的解释是High-performance container datatypes,直接的中文翻译解释高性能容量数据类型。
它总共包含五种数据类型:

其中Counter中文意思是计数器,也就是我们常用于统计的一种数据类型,在使用Counter之后可以让我们的代码更加简单易读。

Counter

先看一个简单的例子:

#统计词频
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
result = {}
for color in colors:
    if result.get(color)==None:
        result[color]=1
    else:
        result[color]+=1
print (result)
#{'red': 2, 'blue': 3, 'green': 1}

下面我们看用Counter怎么实现:

from collections import Counter
colors = ['red', 'blue', 'red', 'green', 'blue', 'blue']
c = Counter(colors)
print (dict(c))

显然代码更加简单了,也更容易读和维护了。

Counter操作

可以创建一个空的Counter:

cnt = Counter()

之后在空的Counter上进行一些操作。
也可以创建的时候传进去一个迭代器(数组,字符串,字典等):

c = Counter('gallahad')                 # 传进字符串
c = Counter({'red': 4, 'blue': 2})      # 传进字典
c = Counter(cats=4, dogs=8)             # 传进元组

Python的enumerate()函数

      对于一个可迭代/可遍历的对象(如列表、字符串),enumerate将其组成一个索引序列,利用它可以同时获得索引和值

      enumerate多用于在for循环中得到计数

如果对一个列表,既要遍历索引又要遍历元素时,首先可以这样写:

list1 = ["这", "是", "一个", "测试"]
for i in range (len(list1)):
    print i ,list1[i]

上述方法有些累赘,利用enumerate()会更加直接和优美:

list1 = ["这", "是", "一个", "测试"]
for index, item in enumerate(list1):
    print(index, item)
>>>
0 这
1 是
2 一个
3 测试

enumerate还可以设置下标起始位置

Python的一些库和函数_第2张图片

 这样下标就是从1开始了,就不是从0了

Python的一些库和函数_第3张图片

这就是从2开始

python的排序函数sorted()

Python的一些库和函数_第4张图片

Python的一些库和函数_第5张图片

此外,sorted()函数也是一个高阶函数,它还可以接收一个key函数来实现自定义的排序,例如按绝对值大小排序:

还可以

myList = ['青海省','内蒙古自治区','西藏自治区','新疆维吾尔自治区','广西壮族自治区']  
myList1 = sorted(myList,key = lambda i:len(i),reverse=True)  
print(myList1) 

按照首元素排序,首元素相同按照第二个,第二个相同按照第三个 

a = [[-5, 1, 4], [-4, 1, 3], [-4, 0, 4], [-2, 1, 1]]
a = sorted(a, key=lambda x: (x[0], x[1], x[2]))

Python的一些库和函数_第6张图片

注意这里的lamdba只能有一个参数,常规的lamdba可以写成lamdba x,y:x+y这种,这里不行,只能写lamdba x: ...

一句话说:python3中一些接受key的函数中(例如sorted,min,max,heapq.nlargest,itertools.groupby),key仅仅支持一个参数,无法实现两个参数之间的对比。采用cmp_to_key 函数,可以接受两个参数,对两个参数做处理,比如做和做差,转换成一个参数,就可以应用于key关键字了。

from functools import cmp_to_key
def cmp(x,y):
    return 1 if x + y < y + x else -1
a = ['4','42','45']
a = sorted(a, key=cmp_to_key(cmp))
print(a)

sort 与 sorted 区别:

         sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作。

         list 的 sort 方法返回的是对已经存在的列表进行操作,无返回值,而内建函数 sorted 方法返回的是一个新的 list,而不是在原来的基础上进行的操作。

排序的同时返回下标

np中可以用argsort,pytorch可以用torch,sort, 都可以顺带返回下标

但python没有现成的函数,可以用enumerate这样

nums = [4, 1, 5, 2, 9, 6, 8, 7]
sorted_nums = sorted(enumerate(nums), key=lambda x: x[1])
nums = [i[1] for i in sorted_nums]
idx = [i[0] for i in sorted_nums]
print(nums)
print(idx)

lamdba表达式

    即匿名函数

    lambda表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用。

    lambda所表示的匿名函数的内容应该是很简单的,如果复杂的话,干脆就重新定义一个函数了,使用lambda就有点过于执拗了。

lambda就是用来定义一个匿名函数的,如果还要给他绑定一个名字的话,就会显得有点画蛇添足,通常是直接使用lambda函数。如下所示:

add = lambda x, y : x+y
add(1,2)  # 结果为3

np.arange()函数:用于生成一维数组

np.arange(头,尾,步长)

Python的一些库和函数_第7张图片

注意头尾是左闭右开的

np.zeros() 生成全0矩阵

zeros的参数n,m表示的是维度

np.zeros(n) 或 np.zeros([n])

np.zeros((n,n))   注意2层括号不能省

Python的一些库和函数_第8张图片

默认填充类型为float64

np.zeros((3,2), dtype=int)

Python的一些库和函数_第9张图片

astype  numpy数据类型转换

Python的一些库和函数_第10张图片

img = img.astype(np.float32)

python的shuffle()函数

shuffle() 方法将序列的所有元素随机排序

Python的一些库和函数_第11张图片

python的pillow库

pillow是Python平台上图像处理标准库,功能强大,使用简单。之前是PIL(Python Imaging Library),但默认仅支持到Python2.7,如果要支持Python3.x版本,必须使用兼容PIL的新版本–Pillow,Pillow中加入了相比于PIL更多的新特性。

pillow和opencv都是图像处理库,但是不是一个量级的。可以说pillow是小渔船,而opencv是航母。但有部分功能是重合的

python的 ImageFont 模块的 truetype() 函数

from PIL import ImageFont

ImageFont.truetype(filename ,   wordsize)

加载一个TrueType或者OpenType字体文件,并且创建一个字体对象。

通常为ttf文件,还有少数ttc文件

ttc文件是几种ttf文件的集合,比如simsun.ttc是“宋体、新宋体、宋体-PUA”三种字体的集合,可以通过在truetype中增加index参量实现对集合内字体的调用

Python的random()函数

random.random() 方法返回随机生成的一个实数,它在[0,1)范围内。

import random

a = random.random()

如果想要生成[0,n)范围内的随机实数

import random

a = random.random()*n

np.random.random()

生成[0,1)范围的浮点数,可以指定size

x = np.random.random((2,3))

 Python的一些库和函数_第12张图片

np.random.uniform()

random.uniform(x, y) 方法将随机生成一个实数,它在 [x,y] 范围内。

Python的一些库和函数_第13张图片

产生整数

random.randint()

import random
#随机产生0-24之间的整数,包括0和24
i = random.randint(0,24)

np.random.randint()

产生某个范围内的整数,可以指定size

x = np.random.randint(0,24,(2,3))

 Python的一些库和函数_第14张图片

np.random.choice()

从数组中随机抽取元素

np.random.choice(a, size=10)  从a中抽10个元素

import numpy as np

a = np.arange(10)
print('a=', a)

print('可重复抽样:', np.random.choice(a, size=10)) #即有放回
print('不可重复抽样:', np.random.choice(a, size=10, replace=False))  #即无放回

# 注意,下面的方式,产生的样本还可以是重复的,因为replace=False只能配合size参数在一次抽样中发挥作用,下面这种属于多次抽样
for i in range(10):
    print(np.random.choice(a, replace=False), end=',')

Python的一些库和函数_第15张图片

replace默认是True

a也可以是一个数值, 如np.random.choice(10,5) 就表示从(0,10)中取5个值

random.choice() / random.choices()

随机选取序列中的一个或多个元素

Python的一些库和函数_第16张图片

random.choices, 用k指定选择个数,默认是1

可能会有重复

 Python的一些库和函数_第17张图片

random.sample() 随即从序列选取多个元素(不重复)

Python的一些库和函数_第18张图片

 随机种子

random.seed()

random.seed(2)

设置随机数种子

包括numpy和torch的,使实验结果可复现

def setup_seed(seed):
     torch.manual_seed(seed)
     torch.cuda.manual_seed_all(seed)
     np.random.seed(seed)
     random.seed(seed)
     torch.backends.cudnn.deterministic = True
# 设置随机数种子
setup_seed(20)

np.random.binomial() 二项式分布函数

numpy.random.binomial(n,p,size=None)

参数n一次试验的样本数n

参数p:事件发生的概率p

test = np.random.binomial(1, 0.5, 10)
print(test)

Python的json库

import json

json.dumps()   

       将 Python 对象编码成 JSON 字符串
json.loads()   

      将已编码的 JSON 字符串解码为 Python 对象

Python的time库

import time

time.localtime()   得到当下的时间

time.asctime(t)    接受时间元组并返回一个可读的形式为

import time

t = time.localtime()
print(t)
print(time.asctime(t))

time.strftime()

Python time strftime() 函数接收以时间元组(某些表示时间的符号),并返回以可读字符串表示的当地时间,格式由参数format决定。

python中时间日期格式化符号:

  • %Y 四位数的年份表示(000-9999)
  • %m 月份(01-12)
  • %d 月内中的一天(0-31)
  • %X 本地相应的时间表示
  • ...

Python的一些库和函数_第19张图片

例2

Python的一些库和函数_第20张图片

timeit 计时器

通常在一段程序的前后都用上time.time(),然后进行相减就可以得到一段程序的运行时间,不过python提供了更强大的计时库:timeit

默认次数是10000次

#导入timeit.timeit
from timeit import timeit  

#看执行1000000次x=1的时间:
timeit('x=1')

#看x=1的执行时间,执行1次(number可以省略,默认值为1000000):
timeit('x=1', number=1)

#看一个列表生成器的执行时间,执行1次:
timeit('[i for i in range(10000)]', number=1)

#看一个列表生成器的执行时间,执行10000次:
timeit('[i for i in range(100) if i%2==0]', number=10000)

测试一个函数的执行时间

此程序测试函数运行1000次的执行时间

from timeit import timeit

def compute():
    s = 0
    for i in range(1000):
        s += i
    print(s)

# timeit(函数名_字符串,运行环境_字符串,number=运行次数)
t = timeit('compute()', 'from __main__ import compute', number=1000)
print(t)

Python的一些库和函数_第21张图片

repeat

由于电脑永远都有其他程序也在占用着资源,你的程序不可能最高效的执行。所以一般都会进行多次试验,取最少的执行时间为真正的执行时间。

from timeit import repeat

def func():
    s = 0
    for i in range(1000):
        s += i

#repeat和timeit用法相似,多了一个repeat参数,表示重复测试的次数(可以不写,默认值为3.),返回值为一个时间的列表。
t = repeat('func()', 'from __main__ import func', number=100, repeat=5)
print(t) 
print(min(t))

Python格式化字符串f-string

f-string,亦称为格式化字符串常量(formatted string literals),是Python3.6新引入的一种字符串格式化方法。注意只能在3.6及以上用

f-string在形式上是以 f 或 F 修饰符引领的字符串(f'xxx' 或 F'xxx'),以大括号 {} 标明被替换的字段;

f-string在本质上并不是字符串常量,而是一个在运行时运算求值的表达式

#简单替换
>>> name = 'Eric'
>>> f'Hello, my name is {name}'
'Hello, my name is Eric'

>>> number = 7
>>> f'My lucky number is {number}'
'My lucky number is 7'


#表达式求值与函数调用
>>> f'A total number of {24 * 8 + 4}'
'A total number of 196'

>>> name = 'ERIC'
>>> f'My name is {name.lower()}'
'My name is eric'

f-string保留小数

可以有3种格式

Python的一些库和函数_第22张图片

 指定宽度

Python的一些库和函数_第23张图片

指定宽度,和保留小数点后几位

Python的一些库和函数_第24张图片

 也可以不指定宽度,直接指定小数点后几位

Python的一些库和函数_第25张图片

Python格式化函数 | format()

Python2.6 开始,新增了一种格式化字符串的函数 str.format(),它增强了字符串格式化的功能。

基本语法是通过 {} 和 : 来代替以前的 % 。

format 函数可以接受不限个参数,位置可以不按顺序。

Python的一些库和函数_第26张图片

这个索引的功能很强,可以重复用某个值

字符串左、右、居中对齐

用 format()函数

左对齐,长度为10

format(s, '<10')

Python的一些库和函数_第27张图片

右对齐,长度为10

format(s, '>10')

Python的一些库和函数_第28张图片

居中对齐,长度为10

format(s, '^10')

居中对齐,长度为10,空余部分用*填充

format(s, '*^10')

不一定非要字符串,也可以是数字

hasattr() 函数

用于判断对象是否包含对应的属性。

hasattr(object, name)

判断object对象中是否有name属性

class Coordinate:
    x = 10
    y = -5
    z = 0
 
point1 = Coordinate() 
print(hasattr(point1, 'x'))
print(hasattr(point1, 'y'))
print(hasattr(point1, 'z'))
print(hasattr(point1, 'no'))  # 没有该属性

Python的一些库和函数_第29张图片

 getattr() 

用于返回一个对象属性值。

class A(object):
     bar = 1
 
a = A()
print(getattr(a, 'bar'))        # 获取属性 bar 值

setattr() 

设置属性值,该属性不一定是存在的。

>>>class A(object):
...     bar = 1
... 
>>> a = A()
>>> getattr(a, 'bar')          # 获取属性 bar 值
1
>>> setattr(a, 'bar', 5)       # 设置属性 bar 值
>>> a.bar
5

如果属性不存在会创建一个新的对象属性,并对属性赋值:

>>>class A():
...     name = "runoob"
... 
>>> a = A()
>>> setattr(a, "age", 28)
>>> print(a.age)
28
>>>

glob库

glob模块是最简单的模块之一,内容非常少。用它可以查找符合特定规则的文件路径名。跟使用windows下的文件搜索差不多

import glob

#获取指定目录下的所有图片
print (glob.glob(r"/home/qiaoyunhao/*/*.png"),"\n")#加上r让字符串不转义

#获取上级目录的所有.py文件
print (glob.glob(r'../*.py')) #相对路径

os.path.join()

路径拼接,把几个路径拼起来,中间加上"/"

import os

Path1 = 'home'
Path2 = 'develop'
Path3 = 'code'

Path10 = Path1 + Path2 + Path3
Path20 = os.path.join(Path1,Path2,Path3)
print ('Path10 = ',Path10)
print ('Path20 = ',Path20)

输出

Path10 = homedevelopcode
Path20 = home\develop\code

''.join     合并字符串

join就是连接字符生成新的字符串

str = "-";
seq = ("a", "b", "c"); # 字符串序列
print str.join( seq );

输出: a-b-c

所以如果是''.join

那就是字符之间的无缝连接

seq = ("a", "b", "c") # 字符串序列
print(''.join(seq))

join 与 +

      join 与 + 都是连接字符串,运算结果一样。

      但是连接字符串数组的时候,join的运算效率高于 +

      当使用“+”连接字符串的时候,每执行一次“+”操作都会申请一块新的内存,然后复制上一个“+”操作的结果和本次操作的有操作符到这块内存空间中,所以用“+”连接字符串的时候会涉及内存申请和复制;join在连接字符串的时候,首先计算需要多大的内存存放结果,然后一次性申请所需内存并将字符串复制过去。在用"+"连接字符串时,结果会生成新的对象,而用join时只是将原列表中的元素拼接起来,因此在连接字符串数组的时候会考虑优先使用join。
 

assert

Python assert(断言)用于判断一个表达式,在表达式条件为 false 的时候触发异常。

loc和iloc 提取行/列数据

loc函数:通过行索引 "Index" 中的具体值来取行数据(如取"Index"为"A"的行

iloc函数:通过行号来取行数据(如取第二行的数据

1. 利用loc、iloc提取行数据

import numpy as np
import pandas as pd
#创建一个Dataframe
data=pd.DataFrame(np.arange(16).reshape(4,4),index=list('abcd'),columns=list('ABCD'))
 
In[1]: data
Out[1]: 
    A   B   C   D
a   0   1   2   3
b   4   5   6   7
c   8   9  10  11
d  12  13  14  15
 
#取索引为'a'的行
In[2]: data.loc['a']
Out[2]:
A    0
B    1
C    2
D    3
 
#取第一行数据,索引为'a'的行就是第一行,所以结果相同
In[3]: data.iloc[0]
Out[3]:
A    0
B    1
C    2
D    3

2. 利用loc、iloc提取列数据

In[4]:data.loc[:,['A']] #取'A'列所有行,多取几列格式为 data.loc[:,['A','B']]
Out[4]: 
    A
a   0
b   4
c   8
d  12
 
In[5]:data.iloc[:,[0]] #取第0列所有行,多取几列格式为 data.iloc[:,[0,1]]
Out[5]: 
    A
a   0
b   4
c   8
d  12
 

np.meshgrid()

numpy.meshgrid()的作用是生成网格点坐标矩阵

#coding:utf-8
import numpy as np
# 坐标向量
a = np.array([1,2,3])
# 坐标向量
b = np.array([7,8])
# 从坐标向量中返回坐标矩阵
# 返回list,有两个元素,第一个元素是X轴的取值,第二个元素是Y轴的取值
res = np.meshgrid(a,b)
#返回结果: [array([ [1,2,3] [1,2,3] ]), array([ [7,7,7] [8,8,8] ])]

Python的一些库和函数_第30张图片

numpy.meshgrid()理解_lllxxq141592654的博客-CSDN博客

np.ravel()

ravel的意思是散开,解开

将矩阵向量化,将多维数组降为一维

Python的一些库和函数_第31张图片

np.ravel(x)也可以写作x.ravel()

plt.contourf()

plt.contourf用来画出不同分类的边界线

z是用来标记不同种类点的

import numpy as np
import matplotlib.pyplot as plt

#生成数据点
x = np.arange(-5, 5, 0.1)
y = np.arange(0, 20, 0.2)
xx, yy = np.meshgrid(x, y)

#对不同类进行标记
z = np.square(xx) - yy > 0
print(z)
#绘图
plt.contourf(xx, yy, z, cmap="cool")
plt.scatter(xx, yy, c=z)
plt.show()

Python的一些库和函数_第32张图片

还有一个可选的参数alpha,表示混合值,介于0(透明)和1(不透明)之间。

isinstance()

isinstance() 函数来判断一个对象是否是某种类型

Python的一些库和函数_第33张图片

copy()

copy()是浅复制,浅拷贝。对应于deepcopy的深拷贝

我们寻常意义的复制就是深复制,即将被复制对象完全再复制一遍作为独立的新个体单独存在。所以改变原有被复制对象不会对已经复制出来的新对象产生影响。

而浅复制并不会产生一个独立的对象单独存在,他只是将原有的数据块打上一个新标签,所以当其中一个标签被改变的时候,数据块就会发生变化,另一个标签也会随之改变。这就和我们寻常意义上的复制有所不同了。

>>> import copy
>>> origin = [1, 2, [3, 4]]
#origin 里边有三个元素:1, 2,[3, 4]
>>> cop1 = copy.copy(origin)
>>> cop2 = copy.deepcopy(origin)
>>> cop1 == cop2
True
>>> cop1 is cop2
False 
#cop1 和 cop2 看上去相同,但已不再是同一个object
>>> origin[2][0] = "hey!" 
>>> origin
[1, 2, ['hey!', 4]]
>>> cop1
[1, 2, ['hey!', 4]]
>>> cop2
[1, 2, [3, 4]]
#把origin内的子list [3, 4] 改掉了一个元素,观察 cop1 和 cop2

deepcopy()

在oop编程中遇到的。

对于一个对象来说,例如gameState(), 如果我们要复制它, newgame = gameState

那么这只是一个指针的复制,即修改newgame会等于修改,gameState

如果用deepcopy的话,就是纯复制了

cop2 = copy.deepcopy(origin)

copy仅拷贝对象本身,而不对中的子对象进行拷贝,故对子对象进行修改也会随着修改。

deepcopy是真正意义上的复制,即从新开辟一片空间。我们经常说的复制实际上就是deepcopy.

math.hypot

hypot() 返回欧几里德范数 sqrt(x*x + y*y)

zip函数

zip() 函数是 Python 内置函数之一,它可以将多个序列(列表、元组、字典、集合、字符串以及 range() 区间构成的列表)“压缩”成一个 zip 对象

my_list = [11,12,13]
my_tuple = (21,22,23)
print([x for x in zip(my_list,my_tuple)])

np.where()

np.where(condition, x, y)

满足条件(condition),输出x,不满足输出y。

import pandas as pd
import numpy as np

df = pd.read_csv('iris.data',header=None)
y = df.iloc[0:100, 4] #取0-100行,第4列
print(y)
y = np.where(y == 'Iris-setosa', -1, 1)
print(y)

Python的一些库和函数_第34张图片

np.dot()  矩阵相乘(点乘)

dot函数为numpy库下的一个函数,主要用于矩阵的乘法运算,其中包括:向量内积、多维矩阵乘法和矩阵与向量的乘法

就是矩阵相乘(点乘)

machine learning中计算y=wx+b的wx相乘就用dot()来算

    def net_input(self, X):
        return np.dot(X, self.w_[1:]) + self.w_[0]


 

np.random.RandomState()

随机数生成器

注意生成器,生成器生成之后再用生成器去生成随机数

from numpy.random import RandomState
rdm = RandomState(1)
a = rdm.uniform(1,2,(3,4))
print(a)

Python的一些库和函数_第35张图片

np.random.normal(loc=0.0, scale=1.0, size=None)

生成高斯分布的概率密度随机数

loc:float
    此概率分布的均值(对应着整个分布的中心centre)
scale:float
    此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
size:int or tuple of ints
    输出的shape,默认为None,只输出一个值
nd1 = np.random.normal(loc=1,scale=2,size=2)

#array([-0.46982446, -1.28956852])


nd1 = np.random.normal(loc=1,scale=2,size=[3,3,4,5])
#nd1的shape就是(3,3,4,5)

np.random.permutation()

随机排列一个序列,或者数组

np.random.permutation(10)
输出:
array([1, 7, 4, 3, 0, 9, 2, 5, 8, 6])
np.random.permutation([1, 4, 9, 12, 15])
输出:
array([15,  1,  9,  4, 12])

np.random.randn()

a = np.random.randn()

则返回一个随机浮点数

返回一个或一组样本,具有标准正态分布(以0为均值、以1为标准差)

np.bincount()

该函数用于统计一个非负的list或array中元素的出现次数

import numpy as np
x = np.array([0, 1, 1, 10])
# bincount()内可以是numpy,也可以是list,注意里面的数必须是非负数,否则报错
# 如果里面有n个数,则输出一个长度为n+1的numpy,第i个索引对应的数即i出现的次数
print(np.bincount(x))
print(np.bincount([0, 1, 1, 3, 2, 1, 5]))
# [1 2 0 0 0 0 0 0 0 0 1]
# [1 3 1 1 0 1]

如下与argmax()结合使用可用于投票

y_pred['label'] = y_pred.apply(lambda x:np.argmax(np.bincount(x)), axis=1)

StandardScaler()

sklearn的类

from sklearn.preprocessing import StandardScaler

作用:去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本

#use StandardScalar class to do standardization(feature scaling)
sc = StandardScaler()
#get mean and std of dataset
sc.fit(X_train) #different from models'fit
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

plt.axhline()

绘制平行于x轴的水平参考线

plt.axhline(y=0.0, c="r", ls="--", lw=2)

y:水平参考线的出发点

c:参考线的线条颜色

ls:参考线的线条风格

lw:参考线的线条宽度

import matplotlib.pyplot as plt
import numpy as np

x = np.linspace(0.05, 10, 1000)
y = np.sin(x)

plt.plot(x, y, ls="-.", lw=2, c="c", label="plot figure")

plt.legend()

plt.axhline(y=0.0, c="r", ls="--", lw=2)
plt.axvline(x=4.0, c="r", ls="--", lw=2)

plt.show()

Python的一些库和函数_第36张图片

plt.xlim() / plt.ylim()

设置x轴的数值显示范围

plt.xlim(xmin, xmax)

xmin:x轴上的最小值

xmax:x轴上的最大值

np.clip()

np.clip是一个截取函数,该函数的作用是将数组a中的所有数限定到范围a_min和a_max中

np.clip(x,x_min,x_max)

所有比a_min小的数都会强制变为a_min,所有比a_max大的数都会强制变为a_max

import numpy as np
# 一维矩阵
x= np.arange(12)
print(x)
print(np.clip(x,3,8))

np.vstack  按垂直方向(行顺序)堆叠数组构成一个新的数组

np.hstack:按水平方向(列顺序)堆叠数组构成一个新的数组

In[11]:
a = np.array([[1,2,3]])
a.shape
Out[11]:
(1, 3)

In [12]:
b = np.array([[4,5,6]])
b.shape
Out[12]:
(1, 3)

In [16]:
c = np.hstack((a,b)) # 将两个(1,3)形状的数组按水平方向叠加
print(c)
c.shape  # 输出形状为(1,6)
[[1 2 3 4 5 6]]
Out[16]:
(1, 6)

In [17]:
a = np.array([[1],[2],[3]])
a.shape
Out[17]:
(3, 1)
In [18]:
b = np.array([[4],[5],[6]])
b.shape
Out[18]:
(3, 1)
In [19]:
c = np.hstack((a,b)) 将两个(3,1)形状的数组按水平方向叠加
print(c)
c.shape  # 输出形状为(3,2)
[[1 4]
 [2 5]
 [3 6]]
Out[19]:
(3, 2)

In[3]:
import numpy as np

In[4]:
a = np.array([[1,2,3]])
a.shape
Out[4]:
(1, 3)

In [5]:
b = np.array([[4,5,6]])
b.shape
Out[5]:
(1, 3)

In [6]:
c = np.vstack((a,b)) # 将两个(1,3)形状的数组按垂直方向叠加
print(c)
c.shape # 输出形状为(2,3)
[[1 2 3]
 [4 5 6]]
Out[6]:
(2, 3)

In [7]:
a = np.array([[1],[2],[3]])
a.shape
Out[7]:
(3, 1)

In [9]:
b = np.array([[4],[5],[6]])
b.shape
Out[9]:
(3, 1)

In [10]:
c = np.vstack((a,b))  # 将两个(3,1)形状的数组按垂直方向叠加
print(c)
c.shape # 输出形状为(6,1)
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]
Out[10]:
(6, 1)

np.r_是按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等。

np.c_是按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等。

import numpy as np
X = 2 * np.random.rand(100, 1)
X_b = np.c_[np.ones((100, 1)), X] # add x0 = 1 to each instance
print(X)
print(X_b)

Python的一些库和函数_第37张图片

np.random.random_sample(n)

随机生成n个(0,1)范围的浮点数

import numpy as np

print(np.random.random_sample(10))

np.pad()

对一维数组的填充

np.pad()常用与深度学习中的数据预处理,可以将numpy数组按指定的方法填充成指定的形状。

import numpy as np
array = np.array([[1, 1],[2,2]])

"""
((1,1),(2,2))表示在二维数组array第一维(此处便是行)前面填充1行,最后面填充1行;
                 在二维数组array第二维(此处便是列)前面填充2列,最后面填充2列
constant_values=(0,3) 表示第一维填充0,第二维填充3
"""
ndarray=np.pad(array,((1,1),(2,2)),'constant', constant_values=(0,3))

print("array",array)
print("ndarray=",ndarray)

Python的一些库和函数_第38张图片

注意这里的constant_values=(0,3) 是广播机制,即对于第一维也是前面填0,后面填3,

第二维也是前面填0后面填3

如果想不一样的话

constant_values=((0,3),(2,5))

np.newaxis

np.newaxis的作用就是在一个位置增加一个一维

import numpy as np

x1 = np.array([1, 2, 3, 4, 5])
# the shape of x1 is (5,)
x1_new = x1[:, np.newaxis]
# now, the shape of x1_new is (5, 1)
# array([[1],
#        [2],
#        [3],
#        [4],
#        [5]])
x2_new = x1_new[:, np.newaxis]
# (5,1,1)
# [[[1]]
# 
#  [[2]]
# 
#  [[3]]
# 
#  [[4]]
# 
#  [[5]]]

x1_new = x1[np.newaxis,:]
# now, the shape of x1_new is (1, 5)
# array([[1, 2, 3, 4, 5]])

divmod()

python divmod() 函数把除数和余数运算结果结合起来

divmod(a,b) = (a // b, a % b)

列表list *取元素值(星)

*就是取出list中的元素的值

list = [1,2,3,4]
print(*list)
print(list)

dataset.__getitem__()

取出对应下标的data

img, target = dataset.__getitem__(1000)
和这句话的功能是一样的
img, target = dataset[1000]

np.column_stack & np.row_stack

np.column_stack 将2个矩阵按列合并

np.row_stack 将2个矩阵按行合并

import numpy as np

a = [[1, 2, 7],
     [-6, -2, -3],
     [-4, -8, -55]
     ]
b = [3, 5, 6]
a = np.array(a)
b = np.array(b)
a_b_column = np.column_stack((a, b))  # 左右根据列拼接
a_b_row = np.row_stack((a, b))  # 上下按照行拼接
print('a_b_column')
print(a_b_column)
print('a_b_row')
print(a_b_row)

Python的一些库和函数_第39张图片

np.transpose()

(326, 474, 3)变为(3, 326, 474)

img = np.transpose(img, (2,0,1))

np.tile()   将数组沿各个方向复制

tile有平铺的意思

np.tile(a,(2))

将函数沿着X轴扩大一倍(变为两倍)。如果扩大倍数只有一个,默认为X轴

Python的一些库和函数_第40张图片

np.tile(a,(2,1))

 第一个参数为Y轴扩大倍数,第二个为X轴扩大倍数

Python的一些库和函数_第41张图片

sys._getframe().f_code.co_name

获取当前函数的 函数名

import sys
class test_class():
    def hello(self):
        print(sys._getframe().f_code.co_name)


if __name__ == '__main__':
    t = test_class()
    t.hello()

nltk.word_tokenize()

输入一个句子,将句子拆分成单词,输出句子中各个单词组成的list(包括标点符号)

Python的一些库和函数_第42张图片

os.symlink()

创建一个软链接

list按字符长度从大到小排序

myList = ['青海省','内蒙古自治区','西藏自治区','新疆维吾尔自治区','广西壮族自治区']  

myList.sort(key = lambda i:len(i),reverse=True)  

print(myList)

获得指定长度字符串, 不够开头补零 zfill

str(num).zfill(7)

得到7位长度的字符串

对列表lsit去重

通过set

orgList = [1,0,3,7,7,5]
#list()方法是把字符串str或元组转成数组
formatList = list(set(orgList))
print (formatList)

np.full

整个数组填充(不是对角线)

np.full((3, 2), 5)

生成一个(3,2)维的数组,填充成5

Python的一些库和函数_第43张图片

np.concatenate()

和torch.cat一样,在某一维拼接起来

没有np.concat()

np.concatenate((x,y), axis=0)

axis就是dim

np.mean()

求平均值

np.mean(list_)

计算log

import math
x = math.log(x)

Softmax

只有tensor有nn.Softmax()

numpy中没有算softmax的函数,要自己写

np.triu()

np.triu(a, k)取矩阵a的上三角数据,但这个三角的斜线位置由k的值确定

Python的一些库和函数_第44张图片

filter()  过滤器

filter()属于内置函数

filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list() 来转换。

该接收两个参数,第一个为函数,第二个为序列,序列的每个元素作为参数传递给函数进行判断,然后返回 True 或 False,最后将返回 True 的元素放到新列表中。

def is_odd(n):
    return n % 2 == 1
 
tmplist = filter(is_odd, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
newlist = list(tmplist)
print(newlist)

 将列表中的每个元素根据is_odd函数判断True/False,  将得到Trye的元素过滤出来

用lambda函数的例子

dict_a = [{'name': 'python', 'points': 10}, {'name': 'java', 'points': 8}]
test_filter = filter(lambda x : x['name'] == 'python', dict_a)
print(list(test_filter))

浮点数保留几位小数

round(x,3)

对浮点数x保留3位小数

注意,round不是四舍五入,而是HALF EVEN(也叫银行家舍入),即<=0.5是0,>0.5是1

Python的一些库和函数_第45张图片

浮点数转整数

①int()

int(x)

 直接舍弃小数部分

Python的一些库和函数_第46张图片

floor() 向下取整         效果等同于int()

ceil()向上取整

如果想要四舍五入

int(x+0.5)

numpy array 中大于某个值的所有元素置0

# 矩阵a中大于Threshold(阈值)的部分置0
a[a > Threshold] = 0
# 矩阵a中小鱼Threshold(阈值)的部分置0
a[a < Threshold] = 0

根据阈值threshold将某向量转换为所有元素为0或者1的二进制向量

通常用于将sigmoid的输出结果(概率)转化为预测标签。

例如大于0.5的元素转换为1,否则转换为0.

Python的一些库和函数_第47张图片

整数类别转one hot编码

y=np.array([0,5,3,2,4,6])
num_classes = 7
np.eye(num_classes)[y]

Python的一些库和函数_第48张图片

获取list特定元素下标  list.index() 

Python的一些库和函数_第49张图片

如果有多个,index()只是找到第一个

np.argwhere()  查找某个指定元素的索引  

import torch
import numpy as np
 
a = np.array([[1,2,3],[4,5,6],[5,6,7],[6,7,8]])
index = np.argwhere( a>4 )
print(index)

Python的一些库和函数_第50张图片

获得h,w 

例如是一个tensor,size是[b,c,h,w]

h,w = x.shape[2:]

Python的一些库和函数_第51张图片

eval()   字符串表达式求值

去掉字符串中的某些值

replace()方法,可以去除全部空格

replace同时可以替换

Python的一些库和函数_第52张图片

 strip()方法,只能去除字符串开头或者结尾的空格

Python的一些库和函数_第53张图片

求掉list中的重复元素

①用set

但这会破坏顺序

list(set(items))

Python的一些库和函数_第54张图片

 ②用collections.OrderedDict

keep order 

from collections import OrderedDict
list(OrderedDict.fromkeys(items).keys())

Python的一些库和函数_第55张图片

** 解包

**在python中是解包操作

a = {'ross':'123456', 'xiaoming':'abc123'}
b = {'lilei':'111111', 'zhangsan':'1234567'}
c = {}
for k in a:
    c[k] = a[k]
for k in b:
    c[k] = b[k]
print(c)

 可以等价于

a = {'ross':'123456', 'xiaoming':'abc123'}
b = {'lilei':'111111', 'zhangsan':'1234567'}
c = {**a, **b}
print(c)

这里的**a和**b相当于将字典a和b的内容直接填写到了这里

统计list元素出现的次数  collections.Counter()

Python的一些库和函数_第56张图片

 collections.Counter(x)得到的是一个counter对象

拆分含有多种分隔符的字符串  re.split()

re是正则表达式的库

但是比字符串的split会慢一些

re.split('[;,|\t]+',s)

itertools.islice  迭代

itertools.islice(iterable, start, stop[, step])
可以返回从迭代器中的start位置到stop位置的元素。如果stop为None,则一直迭代到最后位置。

Python的一些库和函数_第57张图片

当有些迭代器不支持索引查找时,就可以用它来做 

例如我想通过序号查找运动员,但是OrderedDict不支持这种操作

Python的一些库和函数_第58张图片

 那么我就可以

Python的一些库和函数_第59张图片

itertools.chain()连接多个迭代对象

如果都是list可以用+,但是不同的对象的话用itertools.chain连接 

Python的一些库和函数_第60张图片

列表extend()

extend() 函数用于在列表末尾一次性追加另一个序列中的多个值

即如果列表A有5个值,列表B有3个值,想把B的三个值都append到列表A中,如果一个个追加太麻烦,直接一个A.extend(B)就可以了

Python的一些库和函数_第61张图片

np.cumsum() 计算某一维度的累加和

np.cumsum(a,axis=0)

Python的一些库和函数_第62张图片

np.delete()   删除numpy array特定位置index的元素

Python的一些库和函数_第63张图片

np.argsort() 将数组排序后返回排序后的下标

注意返回的只是下标

Python的一些库和函数_第64张图片

 所以取数组x的最小值可以写成:

x[x.argsort()[0]]

数组x的最大值,写成

x[x.argsort()[-1]]

或者用argmin()和argmax()函数

也可以适用于

判断字母/数字   isdigit()   isalpha()

x.isdigit()

x.isalpha()

Python的一些库和函数_第65张图片

 Python的一些库和函数_第66张图片

np.prod()  计算所有元素的乘积

对于有多个维度的数组可以指定轴

如果没有指定那就是所有元素全部相乘

Python的一些库和函数_第67张图片

指定axis

指定计算行的乘积

选择特定的元素相乘

可以设定一个初始值,与输入数组中的元相乘

np类型转换

查看数据类型

x.dtype

转换数据类型

image = image.astype(np.float32)

np.pad()  填充/补零

和torch.pad()稍有不同

如果是想在两个维度上填充的话

np.pad(A,((3,2),(2,3)),'constant',constant_values = (-2,2))   #填充值,前面填充改为-2,后面填充改为2

填充时,从前面轴,往后面轴依次填充。

0轴和1轴分别填充不同的值,先填充0轴,后填充1轴,存在1轴填充覆盖0轴填充的情形

例如A.shape是[128,256] 即第一个(3,2)是在128维度上,第二个(2,3)是在256维度上

(3,2)表示在A的第[0]轴填充(二维数组中,0轴表示行),即在0轴前面填充3个宽度的0,比如数组A中的95,96两个元素前面各填充了3个0;在后面填充2个0,比如数组A中的97,98两个元素后面各填充了2个0

(2,3)表示在A的第[1]轴填充(二维数组中,1轴表示列),即在1轴前面填充2个宽度的0,后面填充3个宽度的0

input 获取用户输入 

 Python的一些库和函数_第68张图片

 x都是str类型

np.fromfile()

根据文本或二进制文件中的数据构造一个数组。

一种读取具有已知数据类型的二进制数据以及解析简单格式化的文本文件的高效方法。使用tofile方法写入的数据可以使用此函数读取。

  • 函数:np.fromfile(frame,dtype=float,count=-1,sep='')
  • frame:文件、字符串。
  • dtype:读取的数据类型。
  • count:读入元素个数,-1表示读入整个文件。
  • sep:数据分割字符串,如果是空串,写入文件为二进制。

find()  检测字符串中是否包含子字符串 str

和in的作用一样

Python find() 方法检测字符串中是否包含子字符串 str ,如果指定 beg(开始) 和 end(结束) 范围,则检查是否包含在指定范围内,如果包含子字符串返回开始的索引值,否则返回-1。

str.find(str, beg=0, end=len(string))

Python的一些库和函数_第69张图片

 可以s.find(a,10), 但是s.find(a, beg=10)或s.find(a, start=10)就报错,很奇怪

chr()和ord()

chr()和ord()是一对对应的函数

  • ord(char)返回ascll数值
  • chr(ascii数值)返回char

Python的一些库和函数_第70张图片

np.linalg  线性代数模块

numpy.linalg模块包含线性代数的函数。使用这个模块,可以计算逆矩阵、求特征值、解线性方程组以及求解行列式等。

求逆矩阵

np.mat()

np.linalg.inv()

Python的一些库和函数_第71张图片

注:矩阵必须是方阵且可逆,否则会抛出LinAlgError异常。

求解线性方程组

np.linalg.solve()

np.linalg中的函数solve可以求解形如 Ax = b 的线性方程组,其中 A 为矩阵,b 为一维或二维的数组,x 是未知变量

Python的一些库和函数_第72张图片

特征值和特征向量

特征值(eigenvalue)即方程 Ax = ax 的根,是一个标量。其中,A 是一个二维矩阵,x 是一个一维向量。特征向量(eigenvector)是关于特征值的向量

np.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应的特征向量的元组

import numpy as np

# 创建一个矩阵
C = np.mat("3 -2;1 0")

# 调用eigvals函数求解特征值
c0 = np.linalg.eigvals(C)
print (c0)
# [ 2. 1.]

# 使用eig函数求解特征值和特征向量 (该函数将返回一个元组,按列排放着特征值和对应的特征向量,其中第一列为特征值,第二列为特征向量)
c1,c2 = np.linalg.eig(C)
print (c1)
# [ 2. 1.]
print (c2)
#[[ 0.89442719 0.70710678]
# [ 0.4472136 0.70710678]]

# 使用dot函数验证求得的解是否正确
for i in range(len(c1)):
print ("left:",np.dot(C,c2[:,i]))
print ("right:",c1[i] * c2[:,i])
#left: [[ 1.78885438]
# [ 0.89442719]]
#right: [[ 1.78885438]
# [ 0.89442719]]
#left: [[ 0.70710678]
# [ 0.70710678]]
#right: [[ 0.70710678]
# [ 0.70710678]]

奇异值分解SVD

# SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积
# numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。

import numpy as np

# 分解矩阵
D = np.mat("4 11 14;8 7 -2")
# 使用svd函数分解矩阵
U,Sigma,V = np.linalg.svd(D,full_matrices=False)
print ("U:",U)
#U: [[-0.9486833 -0.31622777]
# [-0.31622777 0.9486833 ]]
print ("Sigma:",Sigma)
#Sigma: [ 18.97366596 9.48683298]
print ("V",V)
#V [[-0.33333333 -0.66666667 -0.66666667]
# [ 0.66666667 0.33333333 -0.66666667]]
# 结果包含等式中左右两端的两个正交矩阵U和V,以及中间的奇异值矩阵Sigma

# 使用diag函数生成完整的奇异值矩阵。将分解出的3个矩阵相乘
print (U * np.diag(Sigma) * V)
#[[ 4. 11. 14.]
# [ 8. 7. -2.]]

产生某个size的布尔矩阵

B = np.full((4,4), True, dtype = bool)

np.prod() 计算所有元素的乘积

 对于有多个维度的数组可以指定轴,如axis=1指定计算每一行的乘积

 Python的一些库和函数_第73张图片

np.roll

np.roll(a, shift, axis=None)
将a,沿着axis的方向,滚动shift长度

Python的一些库和函数_第74张图片

np.logical_and()  逐元素进行逻辑运算

Python的一些库和函数_第75张图片

你可能感兴趣的:(python,1024程序员节)