numpy
点滴
这篇博文会陆陆续续更新的,因为numpy
这个东西,还是熟一点的话,会更加得心应手.
约定
后面的东西中,都已经假设我们做了如下的导入:
import numpy as np
1. 构建一个对称矩阵
其实并没有很好的办法,但是我们可以通过几个命令的组合来构建一个对角矩阵,举个栗子,假设我们有这样一个矩阵:
In [88]: a = np.arange(9).reshape((3, 3))
In [89]: a
Out[89]:
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
然后我们只保留上三角矩阵:
In [91]: x = np.triu(a)
In [92]: x
Out[92]:
array([[0, 1, 2],
[0, 4, 5],
[0, 0, 8]])
当然,np
中有一个类似的函数是保留下三角矩阵用的,叫做tril
.
然后让x
和x
的转置加一下,立马构成了一个对称矩阵.
In [93]: x + x.T
Out[93]:
array([[ 0, 1, 2],
[ 1, 8, 5],
[ 2, 5, 16]])
当然,我们看得到.对角线上的元素加了两遍,如果你乐意的话,减去一遍对角线的元素即可.
In [96]: x.diagonal() # 获得对角线的元素的值
Out[96]: array([0, 4, 8])
In [97]: np.diag(x.diagonal()) # 根据对角线构建一个矩阵
Out[97]:
array([[0, 0, 0],
[0, 4, 0],
[0, 0, 8]])
In [98]: x + x.T - np.diag(x.diagonal())
Out[98]:
array([[0, 1, 2],
[1, 4, 5],
[2, 5, 8]])
2. 找出矩阵中最大值或者最小值的下标
有的时候我们还真有这样的一个需求,我这里记录一下我的做法:
In [99]: x
Out[99]:
array([[0, 1, 2],
[0, 4, 5],
[0, 0, 8]])
In [100]: x == x.max() # 获得一个掩模矩阵
Out[100]:
array([[False, False, False],
[False, False, False],
[False, False, True]], dtype=bool)
# 接下来要使用到where
In [101]: np.where(x == x.max())
Out[101]: (array([2], dtype=int64), array([2], dtype=int64))
我们可以看得到,最后返回了一个二维的矩阵,而坐标(2, 2)
恰好就是我们要求的值.
再给出一个手册上的例子:
>>> goodvalues = [3, 4, 7]
>>> ix = np.in1d(x.ravel(), goodvalues).reshape(x.shape)
>>> ix
array([[False, False, False],
[ True, True, False],
[False, True, False]], dtype=bool)
>>> np.where(ix)
(array([1, 1, 2]), array([0, 1, 1]))
# (1, 0), (1, 1), (2, 1)
3. 填充对角线的元素
这个函数在进行矩阵运算的时候应该经常会用得到,它就是fill_diagonal
函数.
In [102]: x
Out[102]:
array([[0, 1, 2],
[0, 4, 5],
[0, 0, 8]])
In [103]: np.fill_diagonal(x, 5)
In [104]: x
Out[104]:
array([[5, 1, 2],
[0, 5, 5],
[0, 0, 5]])
获得对角线的元素
In [105]: x
Out[105]:
array([[5, 1, 2],
[0, 5, 5],
[0, 0, 5]])
In [106]: x.diagonal()
Out[106]: array([5, 5, 5])