数组计算:不同维度的数组可以直接运算(数组的维度拓展属性-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’)#设置直方图的风格
一个对大数据集非常有效的算法并不总是小数据集的最佳选择, 反之同理。