关于numpy矩阵运算的小记

关于numpy矩阵运算的小记


发现做矩阵处理是numpy忘了好多,所以记录下来.

array与matrix

matrix是array的分支,matrix和array在很多时候都是通用的,你用哪一个都一样。但这时候,官方建议大家如果两个可以通用,那就选择array,因为array更灵活,速度更快,很多人把二维的array也翻译成矩阵。
但是matrix的优势就是相对简单的运算符号,比如两个矩阵相乘,就是用符号*,但是array相乘不能这么用,得用方法.dot()
array的优势就是不仅仅表示二维,还能表示3、4、5…维,而且在大部分Python程序里,array也是更常用的。

import numpy as np

a1 = np.array([[1, 2],
               [3, 4]])
a2 = np.array([[5, 6],
               [7, 8]])
b1 = np.mat([[1, 2],
             [3, 4]])
b2 = np.mat([[5, 6],
             [7, 8]])

print((np.dot(a1, a2)).all() == (b1 * b2).all())

输出

True

矩阵判等

在矩阵判等中存在各个元素相等和整个矩阵相等两种情况

import numpy as np

a1 = np.array([[1, 2],
               [3, 4]])
a2 = np.array([[5, 6],
               [7, 8]])
b1 = np.mat([[1, 2],
             [3, 4]])
b2 = np.mat([[5, 6],
             [7, 8]])
print('np.dot(a1, a2):\n', np.dot(a1, a2))
print('b1 * b2:\n', b1 * b2)
print((np.dot(a1, a2)) == (b1 * b2))
print((np.dot(a1, a2)).all() == (b1 * b2).all())

输出:

其中==用于判等各个元素相等,用all()方法可以判断整个矩阵相等

矩阵的连接

在numpy中存在按行连接与按列连接两种形式

import numpy as np

x = np.array([[1, 2, 3],
              [4, 5, 6]])
print("x:\n", x)

y = np.array([[7, 8, 9],
              [10, 11, 12]])
print("y:\n", y)

z = np.array([[13, 14, 15]])
print("z:\n", z)

a = np.vstack((x, y, z))
print('np.vstack((x,y,z)):\n', a)
b = np.hstack((x, y))
print('np.hstack((x,y)):\n', b)

输出:

其中np.hstack()是按行连接:行数相同的的连接在一起;np.vstack()按列连接:列书相同的连接在一起。

矩阵的向量化

在矩阵中我们可以使用reshape方法来实现矩阵的向量化,如果在整形操作中将尺寸标注为-1,则会自动计算其他尺寸

import numpy as np

x = np.array([[1, 2, 3],
              [4, 5, 6]])
print("x:\n", x)

y = np.array([[7, 8, 9],
              [10, 11, 12]])
print("y:\n", y)

z = np.array([[13, 14, 15]])
print("z:\n", z)

a = np.vstack((x, y, z))
print('np.vstack((x,y,z)):\n', a)
b = np.hstack((x, y))
print('np.hstack((x,y)):\n', b)

print(a.shape)
print(a.reshape(-1,1))

输出:

矩阵的拆分

使用hsplit,您可以沿数组的水平轴拆分数组,方法是指定要返回的形状相同的数组的数量,或者指定要在其后进行划分的列,使用vsplit,您可以沿数组的竖直轴拆分数组,方法是指定要返回的形状相同的数组的数量,或者指定要在其后进行划分的列。

import numpy as np

a = np.array([[1, 1, 2, 3],
              [1, 5, 7, 3],
              [7, 3, 9, 3],
              [1, 7, 3, 0]])
print(np.hsplit(a, 2))
print(np.vsplit(a, 2))

矩阵的复制

=的简单分配不会复制数组对象或其数据,该copy方法对数组及其数据进行完整复制。

import numpy as np

a = np.array([[1, 1, 2, 3],
              [1, 5, 7, 3],
              [7, 3, 9, 3],
              [1, 7, 3, 0]])
# print(np.hsplit(a, 2))
# print(np.vsplit(a, 2))
b = a
print(id(a))
print(id(b))
c = a.copy()
print(id(c))

矩阵的逆

利用numpy.linalg.inv()可以求得矩阵的逆矩阵

import numpy as np

a = np.array([[1, 1, 2, 3],
              [1, 5, 7, 3],
              [7, 3, 9, 3],
              [1, 7, 3, 0]])

b = np.linalg.inv(a)
print(np.dot(a, b))

矩阵的索引

import numpy as np

a = np.array([[1, 1, 2, 3],
              [1, 5, 7, 3],
              [7, 3, 9, 3],
              [1, 7, 3, 0]])

print(a[2, 3])  # 输出第2+1行第3+1列的数字
print(a[1:])  # 以矩阵形式输出从第1+1行开始的所有数
print(a[1:3])  # 以矩阵形式输出第1+1到第3+1-1行的数
print(a[:, 1])  # 输出矩阵的第1+1列的所有数
print(a[0:3, 1])  # 输出矩阵从0+1行到第3+1-1行的第1+1列的所有数
print(type(a[:3]))
发布了81 篇原创文章 · 获赞 27 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_43309286/article/details/104337074