Numpy入门

 

数组计算:不同维度的数组可以直接运算(数组的维度拓展属性-broadcasting),如常数和1维数组运算,1维数组和3×3数组运算,数组(1×3)和数组(3×1)运算,都是将自己扩展后进行。
维度拓展的规则:1.在低维数组左边加一,然后按这个第一维度方向拓展去匹配另一高维数组。(若此后仍不匹配则错误)

1 np.newaxis  #增加一个维度。如果是一维行数组(1×3),就变成二维列数组(3×1).
2 x[:,np.newaxis] #在列上增加维度,比如(5,)→(5,1).
3 x[np.newaxis,:] #在行上增加维度,比如(5,)→(1,5).
4 x.mean(0) #axis=0,沿第一个方向聚合操作,行的方向。可用来求某个特征的各种统计值。

 


eg.

 1 x=np.random.random((10,3))
 2 x.mean(0) # axis=0,第一个维度(行)聚合操作。
 3 x_centered=x-x.mean(0) #归一化 ,每个特征减去该特征的均值,用到了broadcasting
 4 x_centered.mean(0) #归一化后的特征均值为0(即特征所有元素之和为0)
 5 
 6 #x,y分别表示(0,5)区间内50个步长的数组
 7 x = np.linspace(0, 5, 50) #一维
 8 y = np.linspace(0, 5, 50)[:, np.newaxis] #2维
 9 z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x) #得到一个二维数组
10 import matplotlib.pyplot as plt
11 plt.imshow(z, origin=‘lower’, extent=[0, 5, 0, 5], cmap=‘viridis’)
12 plt.colorbar()    #实质是二元函数的可视化

 

聚合计算
掩码:对数组进行简单索引,利用一些条件
eg:
x**[x<5]**:括号内相当于掩码操作[x<5]返回布尔数组。x[x<5]最后返回的值是掩码数组(布尔操作后的逻辑数组)对应位置为True的值。

关于数组逻辑运算
通过将布尔操作、 掩码操作和聚合结合, 可以解决数据集各种统计特征。使用关键字 and/or 与使用逻辑操作运算符 &/|
python中使用关键字 and/or 与使用逻辑操作运算符 &/|区别是:and 和 or 判断整个对象是真或假, 而 & 和 | 是指
每个对象中的比特位。(操作的是每个元素的比特)
两个数组对应位置去比较时可以用|,eg:

1 A = np.array([1, 0, 1, 0, 1, 0], dtype=bool)
2 B = np.array([1, 1, 1, 0, 1, 1], dtype=bool)
3 A | B
4 
5 #out:
6 array([ True, True, True, False, True, True])
7 #但是用or,如A or B会报错。

 


对给定数组进行逻辑运算时, 你也应该使用 | 或 &, 而不是or 或 and。
and 和 or 对整个对象执行单个布尔运算, 而 & 和| 对一个对象的内容(单个比特或字节) 执行多个布尔运算。 对于NumPy 布尔数组, 首选 & 和|

数组标准索引:x[a,b] # a代表行,b代表列。
索引的broadcasting

 1 x=array([[ 0, 1, 2, 3],[ 4, 5, 6, 7],[ 8, 9, 10, 11]])
 2 
 3 x[[0,1,2],[2,1,3]]
 4 
 5 #output:
 6 array([2,5,11])
7 x[[0,1,2],[2,1,3]] 8 #索引数组是(3,1)*(1,3),因此根据broadcasting特性输出数组为(3,3)。 9 10 #output: 11 array([[ 2, 1, 3],[ 6, 5, 7],[10, 9, 11]])

 

组合索引:
与简单索引组合: x[2, [0,2,1]]:#第三行的第1,3,2元素。
与切片组合: X[1:, [2, 0, 1]]。

组合索引的用途示例:(从一点矩阵中选择行的子集)
选择随机点

1 mean = [0, 0]
2 cov = [[1, 2],
3 [2, 5]]
4 X = np.random.multivariate_normal(mean, cov, 100) #利用给定均值和方差生成数据。
5 X.shape
6 import matplotlib.pyplot as plt
7 import seaborn; seaborn.set() # 设置绘图风格
8 plt.scatter(X[:, 0], X[:, 1])#散点图

 

用索引修改值:

 1 x = np.arange(10)
 2 i = np.array([2, 1, 8, 4])
 3 x[i] = 99
 4 print(x)
 5 
 6 #output:
 7  [ 0 99 99 3 99 5 6 7 99 9]
 8 
 9 x[i] -= 10
10 print(x)
11 
12 #output:
13 [ 0 89 89 3 89 5 6 7 89 9]

 

数据区间划分:

1 np.random.seed(42)
2 x = np.random.randn(100)
3 bins = np.linspace(-5, 5, 20) #设置坐标范围
4 plt.hist(x, bins, histtype=‘step’)#设置直方图的风格

 

一个对大数据集非常有效的算法并不总是小数据集的最佳选择, 反之同理。

 

posted @ 2018-10-17 19:39  Parallax  阅读(137)  评论(0编辑  收藏  举报