numpy点滴

3 篇文章 0 订阅

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.

然后让xx的转置加一下,立马构成了一个对称矩阵.

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])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值