一、线性代数中的简单数组操作
这部分内容,在之前的学习笔记中已经有过部分涉及,这里介绍一些与线性代数有较大联系的数组操作。另外,再次说明一点,与其他矩阵语言不同,numpy中矩阵乘法符号为“@”。
import numpy as np
a = np.arange(4).reshape(2, 2)
print(a.transpose()) #矩阵转置
print(np.linalg.inv(a)) #求矩阵的逆
u = np.eye(3) #构造3阶单位矩阵
print(u)
print(np.trace(u)) #求矩阵的迹
y = np.array([[5], [7]])
print(np.linalg.solve(a, y)) #求解线性矩阵方程
#输出:
[[0 2]
[1 3]]
[[-1.5 0.5]
[ 1. 0. ]]
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
3.0
[[-4.]
[ 5.]]
二、其他索引技巧
1.使用索引数组进行索引
numpy除了之前简单的通过整数和切片索引外,还可以通过数组来进行索引,例子如下:
import numpy as np
a = np.arange(6)**3
print(a)
i = np.array([1, 3, 2, 5, 4]) #设置简单的一维数组
print(a[i])
j = np.array([[3, 4], [1, 2]]) #设置二维的数组
print(a[j])
#输出:
[ 0 1 8 27 64 125]
[ 1 27 8 125 64]
[[27 64]
[ 1 8]]
简单说明:a[i]返回的是一个数组。如上图例子中i取1,对应a[1]为1;i取3,对应a[3]为27;i取2,对应a[2]取8...以此索引,最终从完整的数组a中返回一个对应数组i中元素索引的数组。对于二维的数组进行数组索引也是同样的道理。
除此之外,当a为多维数组时,单个索引数组指的是第一个维度a,具体示例如下:
import numpy as np
palette = np.array([[0, 0, 0],
[255, 0, 0],
[0, 255, 0],
[0, 0, 255],
[255, 255, 255]])
image = np.array([[0, 1, 2, 0],
[0, 3, 4, 0]])
print(palette[image])
#输出:
[[[ 0 0 0]
[255 0 0]
[ 0 255 0]
[ 0 0 0]]
[[ 0 0 0]
[ 0 0 255]
[255 255 255]
[ 0 0 0]]]
简单说明:image数组中第一行为[0, 1, 2 , 0],分别对应数组a[0]:[0 0 0] a[1]:[255 0 0] a[2]:[0 255 0] a[0]:[0 0 0];第二行为[0, 3, 4, 0]分别对应数组a[0]:[0 0 0] a[3]:[0 0 255] a[4]:[255 255 255] a[0]:[0 0 0]
2.使用布尔数组进行所引
废话不多说,直接看第一种方法的示例:
import numpy as np
a = np.arange(12).reshape(3, 4)
b = a > 4 #设置筛选条件
print(b)
print(a[b]) #对应筛选条件得到数组
a[b] = 0 #属性分配
print(a)
#输出:
[[False False False False]
[False True True True]
[ True True True True]]
[ 5 6 7 8 9 10 11]
[[0 1 2 3]
[4 0 0 0]
[0 0 0 0]]
除此之外,用布尔值进行索引的第二种方法更类似于整数索引; 对于数组的每个维度,我们给出一个1D布尔数组,选择我们想要的切片:
import numpy as np
a = np.arange(12).reshape(3, 4)
b1 = np.array([False, True, True]) #设置第一维度的筛选条件
b2 = np.array([True, False, True, False]) #设置第二维度的筛选条件
print(a[b1, :])
print(a[:, b2])
print(a[b1, b2])
#输出:
[[ 4 5 6 7]
[ 8 9 10 11]]
[[ 0 2]
[ 4 6]
[ 8 10]]
[ 4 10]