🖼 人工智能学习总目录

🖼《利用Python进行数据分析》小结可以看这里

本章知识小结:

  • 1、ndarryN维数组、np.arange(100) (更优)、list(range(100))、np.random.randn(2,3)、np.array(data)
  • 2、data.ndim、data.shape、data.dtype
  • 3、np.ones、ones_like、zeros、empty、full([3,3],2)、asarry、eye、identity
  • 4、i1、u1、i2、u2、i4、u4、i8、u8、 f2、f4 或 f、f8 或 d、f16 或 g、c8、c16、c32 、?、O、S、U
  • 5、向量化(同尺寸数组逐元素比较)、切片、布尔索引用|&(and、or没用)
  • 6、神奇索引、arr[[4,3,0,6]]、arr[[-3,-5,-7]]、arr[[1,2,3],[1,2,3]]、arr[[1,5,7,2]][:,[0,3,1,2]]
  • 7、转置换轴、arr.T、arr.swapaxes(0,1)、arr.transpose((1,0))
  • 8、ufunc、向量化封装、一元np.add、subtract除、multiply、divide除、floor_divide整除、power次幂、maximun、fmax
  • 9、minimun、fmin、mod求模、copysign改符号值、greater、greater_equal、less、less_equal、euqal、not_equal逐个比较返回布尔数组
  • 10、arccos、arccosh、arcsin、arcsinh、arctan、arctanh、logical_not对数组的元素按位取反
  • 11、二元add、subtract除、multiply、divide除、floor_divide整除、power次幂、maximun、fmax、minimun、fmin(忽略NaN)
  • 12、mod求模、copysign改符号值、greater、greater_equal、less、less_equal、euqal、not_equal逐个比较返回布尔数组
  • 13、logical_and、logical_or、logical_xor异或
  • 14、接收n维数组xs , ys = np.meshgrid(points,points)、 np.where(condition,xarr,yarr)
  • 15、sum、mean、std标准差、var方差、min、max、argmin最小值位置、argmax、cumsum从0开始累计和、cumpord从1开始累计积
  • 16、np.unique(arr) 等价于 sorted(set(str))、 np.in1d(x,y) x中元素是否包含在y中,返回布尔数组intersect1d(x,y) 交集排序
  • 17、union1d(x,y) 并集排序 、 setdiff1d(x,y) 差集排序 、 setxor1d(x,y 异或集排序)
  • 18、 np.save(‘a.npy’,arr) 、 np.load(‘a.npy’) 、 np.savez(‘b.npz’,a=arr,b=arr)、np.savez_compressed
  • 19、diag对角元素返回一维数组 、 dot矩阵点乘 、trace主对角线元素和 、 det计算矩阵行列式、eig计算特征值和特征向量 、 inv计算逆矩阵
  • 20、pinv计算Moore-Penrose伪逆 、 qr计算QR分解、svd计算奇异值分解SVD 、 solve求解x的线性系统Ax=b 、 lstsq计算Ax=b的最小二乘积
  • 21、seed、permutation一个序列的随机排列、shuffle随机排列一个序列、rand均匀分布抽取样本、randint由低到高范围抽取随机整数、randn均值0方差1正态分布抽取样本
    • 22、binomial二项分布抽取样本、normal正态\高斯分布中抽取样本、beta从beta数据中抽取、chisquare卡方分布中抽取样本、gamma伽马分布中抽取、uniform均匀[0,1)分布中抽取

1、Numpy ndarray:多维数组对象

ndarray是N-维数组对象(”数组”、”Numpy数组”、”array”都是ndarray对象)

ndarray是python中一个快速、灵活的大型数据集容器

1.1 生成ndarray

  • np.array()———将输入数据转化为ndarray,默认复制所有的输入数据
  • np.asarry()———将输入数据转化为ndarray,如果输入已是ndarray不再复制
  • np.arange()———Python内建函数range的数组版,不指名默认数据类型是float64浮点型
  • np.ones()、np.ones_like()———根据给定形状和数据类型生成全1数组、生成一个形状一样的全1数组
  • np.zeros()、np.zeros_like()———根据给定形状和数据类型生成全0数组、生成一个形状一样的全0数组
  • np.empty()、np.empty_like()———根据给定形状和数据类型生成一个没有初始化数值的数组、生成一个形状一样的一个没有初始化数值的数组
  • np.full()、np.full_like()———根据给定形状和数据类型生成一个指定数值的数组、生成一个形状一样的一个指定数值的数组
  • np.eye()、np.identity()———生成一个NxN特征矩阵(对角线1,其他0)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

# 列表转换ndarray
data1 = [6,7.5,8,0,1]
arr1 = np.array(data1)
print(arr1)

# 嵌套序列转换ndarray
data2 = [[1,2,3],[4,5,6]]
arr2 = np.array(data2)
print(arr2)

# 属性shape、ndim、dtype
print(arr1.shape,arr1.ndim,arr1.dtype)
print(arr2.shape,arr2.ndim,arr2.dtype)

1.2 ndarry的数据类型

  • int8、uint8、int16、uint16、int32、uint32、int64、uint64 — i1、u1、i2、u2、i4、u4、i8、u8 — 有符号和无符号整数
  • float16、float32、float64、uint128 — f2、f4 或 f、f8 或 d、f16 或 g — 半精度浮点数、单精度浮点数、双精度浮点数、拓展精度浮点数
  • complex64、complex128、complex256 — c8、c16、c32 — 分别对应32、64、128位浮点数的复数
  • bool、object、string_、unicode_ — ?、O、S、U — 布尔值、obiect、修正ASCII字符串类型’、修正Unicode类型
1
2
3
4
5
6
7
8
9
10
import numpy as np

# 展示数据类型dtype
arr = np.array([ 1.1 , 2.2 , 3.3 , 4.4 , 5.5 ] )
print(arr.dtype)

# 显示转换数组的数据类型astype(使用astype总是生成一个新数组)
arr = np.array([ 1.1 , 2.2 , 3.3 , 4.4 , 5.5 ] )
print(arr,arr.dtype)
print(arr.astype(np.int32),arr.dtype) # 类型是按照精度判断的,所以dtype不会变,但是实际上类型变化了

1.3 Numpy数组算术

允许批量计算而无需for循环,一般称这种特性是向量化(任何两个等尺寸数组之间的算数操作都应用了逐元素的操作)

同尺寸数组比较会产生一个布尔值数组

1.4 基础索引与切片

一个重点,可以让自己选中 数据的子集或某个单元素

实际上多维和一维索引切片差不多,都很简单

1.5 布尔索引

布尔值数组的长度不正确时,布尔值选择数据的方法并不会报错

布尔数组运算用 | 和 & (and和or对布尔数组没用)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

names = np.array(['Bob','Joe','Will','Bob','Will','Joe','Joe'])
data = np.random.randn(7,4)

print(data)

print(names == 'Bob')
print(data[names == 'Bob'])

print(~(names == 'Bob'))
print(data[~(names == 'Bob')])

data [ data < 0 ] = 0
print(data) #如果使用的是jupyter notebook 直接输入data就行不要用print

1.6 神奇索引

神奇索引是NumPy中的术语,用于描述使用整数数组进行数据索引

总是讲数据飞执导一个新的数组中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np

arr = np.empty((8,4))
for i in range(8):
arr[i] = i
print(arr)

# 符合特定序列的子集
print(arr[[4,3,0,6]])

# 负索引找符合特定序列的子集
print(arr[[-3,-5,-7]])

# 找特定元素 (1,1)(2,2)(3,3)
arr = np.arange(32).reshape((8,4))
print(arr[[1,2,3],[1,2,3]])

# 先找行,所有列,然后列排序
print(arr[[1,5,7,2]][:,[0,3,1,2]])

1.7 数组转置和换轴

转置是一种数据重组形式,数组有transpose和swapaxes方法、T属性

1
2
3
4
5
6
import numpy as np

arr = np.arange(15).reshape((3,5))
print(arr.T)
print(arr.swapaxes(0,1)) #返回数组视图,并没有对数据进行复制
print(arr.transpose((1,0)))

2、通用函数:快速地逐元素数组函数

通用函数,也称ufunc,是一种在ndarray数据中进行逐元素操作的函数。

某些简单函数接受一个或多个标量数据,并产生一个或多个标量结果,通用函数就是对这些简单函数的向量化封装

  • abs、fabs、sqrt平方根、square平方、exp、log、log10、sign计算符号、ceil上取整、floor
  • rint元素保留到整数位、modf小数整数分开按数组返回、isnan返回None(不是一个数字)形式是布尔数组
  • isfinite返回数组是否有限(非inf、非NaN)、isinf是否是无限的、cos、cosh、sin、sinh、tan、tanh
  • arccos、arccosh、arcsin、arcsinh、arctan、arctanh、logical_not对数组的元素按位取反

    二元通用函数

  • add、subtract除、multiply、divide除、floor_divide整除、power次幂、maximun、fmax、minimun、fmin(忽略NaN)

  • mod求模、copysign改符号值、greater、greater_equal、less、less_equal、euqal、not_equal逐个比较返回布尔数组
  • logical_and、logical_or、logical_xor异或
1
2
3
4
5
6
7
8
import numpy as np

#简单通用函数,比如sqrt、exp
arr = np.arange(10)
print(np.sqrt(arr))
print(np.exp(arr))

#二元通用函数,比如add、maximum

3、使用数组进行面向数组编程

numpy数组可以让我们利用简单的数组表达式完成多种数据操作任务,而无需写大量循环

向量化:利用数组表达式来代替显示循环的方法

广播机制:解决向量化计算的有效方式

1
2
3
4
5
6
7
8
import numpy as np
points = np.arange(-5,5,0.01) # 1000个数
xs , ys = np.meshgrid(points,points) # meshgrid网格矩阵
z = np.sqrt(xs**2 + ys**2)

import matplotlib.pyplot as plt
plt.imshow(z,cmap=plt.cm.gray);plt.colorbar()
plt.title("Image plot of $\sqrt{x^2 + y^2}$ for a grid of values")

3.1 将条件逻辑作为数组操作

np.where(condition,xarr,yarr) 等价于 [ (xarr if condition else yarr) for x,y,c in zip(xarr,yarr,condition)]

np.where(arr0 , 2 , arr) 仅把arr中的负值设置为2

3.2 数字和统计方法

计算数组统计值或关于轴向数据的数学函数,可以作为数组的方式被调用

可以使用聚合函数(也叫缩减函数),sum、mean、std

可以传入参数 axis=1表示维度,默认值输入数字表示维度

  • sum、mean、std标准差、var方差
  • min、max、argmin最小值位置、argmax、cumsum从0开始累计和、cumpord从1开始累计积
  • any至少有个True、all全为True?、sort

3.3 唯一值

np.unique(arr) 等价于 sorted(set(str))

np.in1d(x,y) x中元素是否包含在y中,返回布尔数组

  • intersect1d(x,y) 交集排序 、 union1d(x,y) 并集排序 、 setdiff1d(x,y) 差集排序 、 setxor1d(x,y 异或集排序)

4、使用数据进行文件输入和输出

大部分用户倾向于用pandas

数组默认情况下是以压缩格式进行存储的,后缀名是.npy

np.save(‘a.npy’,arr) 、 np.load(‘a.npy’) 、 np.savez(‘b.npz’,a=arr,b=arr) 多个数组

5、线性代数

和Matlab不同点在于是矩阵的逐元素乘积,不是矩阵的点乘积

  • diag对角元素返回一维数组 、 dot矩阵点乘 、trace主对角线元素和 、 det计算矩阵行列式
  • eig计算特征值和特征向量 、 inv计算逆矩阵 、 pinv计算Moore-Penrose伪逆 、 qr计算QR分解
  • svd计算奇异值分解SVD 、 solve求解x的线性系统Ax=b 、 lstsq计算Ax=b的最小二乘积

6、伪随机数生成

np.random可以高效地生成多种概率分布下的完整样本值数组

  • seed、permutation一个序列的随机排列、shuffle随机排列一个序列
  • rand均匀分布抽取样本、randint由低到高范围抽取随机整数、randn均值0方差1正态分布抽取样本
  • binomial二项分布抽取样本、normal正态高斯分布中抽取样本、beta从beta数据中抽取
  • chisquare卡方分布中抽取样本、gamma伽马分布中抽取、uniform均匀[0,1)分布中抽取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import numpy as np

# normal正态分布例子
samples = np.random.normal((4,4))
print(samples)

# 生成大样本的normalvariate
from random import normalvariate
N=1_000_000
%timeit samples = [normalvariate(0,1) for _ in range(N)]
print(samples)

# np.random.RandomState独立于其他随机状态的随机数生成器
rng = np.random.RandomState(1234)
rng.randn(10)

7、示例:随机漫步

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import random
import numpy as py
import matplotlib.pyplot as plt

# 简单漫步
position = 0
walk = [position]
steps = 1000
for i in range(steps):
step = 1 if random.randint(0,1) else -1
position += step
walk.append(position)

plt.plot(walk[:100])
plt.show()

# 对漫步做一些统计
nsteps = 1000
draws = np.random.randint(0,2,size=nsteps)
steps = np.where(draws>0,1,-1)
walk = steps.cumsum()

print(walk.min())
print(walk.max())

# 一次模拟多个随机漫步
nwalks = 5000
nsteps = 1000
draws = np.random.randint(0,2,size=(nwalks,nsteps))
steps = np.where(draws>0,1,-1)
walks = steps.cumsum(1) #参数没什么影响

print(walks.min())
print(walks.max())
print((np.abs(walks) >= 30).any())
print((np.abs(walks) >= 30).any(1).sum())