数组计算:不同维度的数组可以直接运算(数组的维度拓展属性-broadcasting),如常数和1维数组运算,1维数组和3×3数组运算,数组(1×3)和数组(3×1)运算,都是将自己扩展后进行。
维度拓展的规则:1.在低维数组左边加一,然后按这个第一维度方向拓展去匹配另一高维数组。(若此后仍不匹配则错误)
np.newaxis:增加一个维度。如果是一维行数组(1×3),就变成二维列数组(3×1).
x[:,np.newaxis]:在列上增加维度,比如(5,)→(5,1).
x[np.newaxis,:]:在行上增加维度,比如(5,)→(1,5).
x.mean(0)#axis=0,沿第一个方向聚合操作,行的方向。可用来求某个特征的各种统计值。
eg.
x=np.random.random((10,3))
x.mean(0) # axis=0,第一个维度(行)聚合操作。
x_centered=x-x.mean(0) #归一化 ,每个特征减去该特征的均值,用到了broadcasting
x_centered.mean(0) #归一化后的特征均值为0(即特征所有元素之和为0)
#x,y分别表示(0,5)区间内50个步长的数组
x = np.linspace(0, 5, 50) #一维
y = np.linspace(0, 5, 50)[:, np.newaxis] #2维
z = np.sin(x) ** 10 + np.cos(10 + y * x) * np.cos(x) #得到一个二维数组
import matplotlib.pyplot as plt
plt.imshow(z, origin=‘lower’, extent=[0, 5, 0, 5], cmap=‘viridis’)
plt.colorbar() #实质是二元函数的可视化
聚合计算
掩码:对数组进行简单索引,利用一些条件
eg:
x**[x<5]**:括号内相当于掩码操作[x<5]返回布尔数组。x[x<5]最后返回的值是掩码数组(布尔操作后的逻辑数组)对应位置为True的值。
关于数组逻辑运算
通过将布尔操作、 掩码操作和聚合结合, 可以解决数据集各种统计特征。使用关键字 and/or 与使用逻辑操作运算符 &/|
python中使用关键字 and/or 与使用逻辑操作运算符 &/|区别是:and 和 or 判断整个对象是真或假, 而 & 和 | 是指
每个对象中的比特位。(操作的是每个元素的比特)
两个数组对应位置去比较时可以用|,eg:
A = np.array([1, 0, 1, 0, 1, 0], dtype=bool)
B = np.array([1, 1, 1, 0, 1, 1], dtype=bool)
A | B
out:array([ True, True, True, False, True, True])
但是用or,如A or B会报错。
对给定数组进行逻辑运算时, 你也应该使用 | 或 &, 而不是or 或 and。
and 和 or 对整个对象执行单个布尔运算, 而 & 和| 对一个对象的内容(单个比特或字节) 执行多个布尔运算。 对于NumPy 布尔数组, 首选 & 和|。
数组标准索引:x[a,b] # a代表行,b代表列。
索引的broadcasting:
x=
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
x[[0,1,2],[2,1,3]]
output:array([2,5,11])
x[[0,
1,
2],[2,1,3]] #索引数组是(3,1)*(1,3),因此根据broadcasting特性输出数组为(3,3)。
output:
array([[ 2, 1, 3],
[ 6, 5, 7],
[10, 9, 11]])
组合索引:
与简单索引组合: x[2, [0,2,1]]:#第三行的第1,3,2元素。
与切片组合: X[1:, [2, 0, 1]]。
组合索引的用途示例:(从一点矩阵中选择行的子集)
选择随机点:
mean = [0, 0]
cov = [[1, 2],
[2, 5]]
X = np.random.multivariate_normal(mean, cov, 100) #利用给定均值和方差生成数据。
X.shape
import matplotlib.pyplot as plt
import seaborn; seaborn.set() # 设置绘图风格
plt.scatter(X[:, 0], X[:, 1])#散点图
用索引修改值:
x = np.arange(10)
i = np.array([2, 1, 8, 4])
x[i] = 99
print(x)
output: [ 0 99 99 3 99 5 6 7 99 9]
x[i] -= 10
print(x)
output:[ 0 89 89 3 89 5 6 7 89 9]
数据区间划分:
np.random.seed(42)
x = np.random.randn(100)
bins = np.linspace(-5, 5, 20) #设置坐标范围
plt.hist(x, bins, histtype=‘step’)#设置直方图的风格
一个对大数据集非常有效的算法并不总是小数据集的最佳选择, 反之同理。