Numpy中对向量、矩阵的使用详解

在下面的代码里面,我们利用numpy和scipy做了很多工作,每一行都有注释,讲解了对应的向量/矩阵操作。

归纳一下,下面的代码主要做了这些事:

  • 创建一个向量
  • 创建一个矩阵
  • 创建一个稀疏矩阵
  • 选择元素
  • 展示一个矩阵的属性
  • 对多个元素同时应用某种操作
  • 找到最大值和最小值
  • 计算平均值、方差和标准差
  • 矩阵变形
  • 转置向量或矩阵
  • 展开一个矩阵
  • 计算矩阵的秩
  • 计算行列式
  • 获取矩阵的对角线元素
  • 计算矩阵的迹
  • 计算特征值和特征向量
  • 计算点积
  • 矩阵的相加相减
  • 矩阵的乘法
  • 计算矩阵的逆

一起来看代码吧:

# 加载numpy库
import numpy as np

from scipy import sparse

# 创建一个一维数组表示一个行向量
vector_row = np.array([1, 2, 3])

# 创建一个一维数组表示一个列向量
vector_column = np.array([[1], [2], [3]])

# 创建一个二维数组表示一个矩阵
matrix1 = np.array([[1, 2], [1, 2], [1, 2]])

# 利用Numpy内置矩阵数据结构
matrix1_object = np.mat([[1, 2], [1, 2], [1, 2]])

# 创建一个新的矩阵
matrix2 = np.array([[0, 0], [0, 1], [3, 0]])

# 创建一个压缩的稀疏行(CSR)矩阵
matrix2_sparse = sparse.csc_matrix(matrix2)

# 查看稀疏矩阵
print(matrix2_sparse)

# 创建一个更大的矩阵
matrix_large = np.array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
             [0, 1, 0, 0, 0, 0, 0, 0, 0, 0],
             [3, 0, 0, 0, 0, 0, 0, 0, 0, 0]])

# 创建一个CSR矩阵
matrix_large_sparse = sparse.csr_matrix(matrix_large)

# 查看更大的稀疏矩阵
print(matrix_large_sparse)

# 创建一个行向量
vector = np.array([1, 2, 3, 4, 5, 6])

# 创建矩阵
matrix_vector = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

# 选择向量的第三个元素
print(vector[2])

# 选择第二行第二列
print(matrix_vector[1, 1])

# 选取一个向量的所有元素
print(vector[:])

# 选取从0开始一直到第3个(包含第3个)元素
print(vector[:3])

# 选取第3个元素之后的全部元素
print(vector[3:])

# 选取最后一个元素
print(vector[-1])

# 选取矩阵的第1行和第2行以及所有列
print(matrix_vector[:2, :])

# 选取所有行以及第2列
print(matrix_vector[:, 1:2])

# 选取所有行以及第2列并转换成一个新的行向量
print(matrix_vector[:, 1])

# 创建新的矩阵
matrix3 = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])

# 查看行数和列数
print(matrix3.shape)

# 查看元素数量
print(matrix3.size)

# 查看维数
print(matrix3.ndim)

# 下面使用的矩阵是matrix_vector
# 创建一个匿名函数,返回输入值加上100以后的值
add_100 = lambda i: i+100

# 创建向量转化函数
vectorized_add_100 = np.vectorize(add_100)

# 对矩阵的所有元素应用这个函数
print(vectorized_add_100(matrix_vector))

# 用后矩阵本身不变
print(matrix_vector)

# 连续使用
print(vectorized_add_100(vectorized_add_100(matrix_vector)))

# 返回最大的元素
print(np.max(matrix_vector))

# 返回最小元素
print(np.min(matrix_vector))

# 找到每一列的最大元素
print(np.max(matrix_vector, axis=0))

# 找到每一行最大的元素
print(np.max(matrix_vector, axis=1))

# 返回平均值
print(np.mean(matrix_vector))

# 返回方差
print(np.var(matrix_vector))

# 返回标准差
print(np.std(matrix_vector))

# 求每一列的平均值
print(np.mean(matrix_vector, axis=0))

# 求每一行的方差
print(np.var(matrix_vector, axis=1))

# 将matrix3矩阵变为2×6矩阵
matrix4 = matrix3.reshape(2, 6)
print(matrix4)

# 上面的变形要求前后元素个数相同,且不会改变元素个数
print(matrix4.size)

# reshape时传入参数-1意味着可以根据需要填充元素
print(matrix3.reshape(1, -1))

# reshape如果提供一个整数,那么reshape会返回一个长度为该整数值的一维数组
print(matrix3.reshape(12))

# 转置matrix_vector矩阵
print(matrix_vector.T)

# 严格地讲,向量是不能被转置的
print(vector.T)

# 转置向量通常指二维数组表示形式下将行向量转换为列向量或者反向转换
print(np.array([[1, 2, 3, 4, 5, 6]]).T)

# 将matrix_vector矩阵展开
print(matrix_vector.flatten())

# 将矩阵展开的另一种策略是利用reshape创建一个行向量
print(matrix_vector.reshape(1, -1))

# 创建用于求秩的新矩阵
matrix5 = np.array([[1, 1, 1], [1, 1, 10], [1, 1, 15]])

# 计算矩阵matrix5的秩
print(np.linalg.matrix_rank(matrix5))

# 创建用于行列式求解的新矩阵
matrix6 = np.array([[1, 2, 3], [2, 4, 6], [3, 8, 9]])

# 求解矩阵matrix6的行列式
print(np.linalg.det(matrix6))

# 返回矩阵的对角线元素
print(matrix6.diagonal())

# 返回主对角线向上偏移量为1的对角线元素
print(matrix6.diagonal(offset=1))

# 返回主对角线向下偏移量为1的对角线元素
print(matrix6.diagonal(offset=-1))

# 返回矩阵的迹
print(matrix6.trace())

# 求迹的另外的方法(返回对角线元素并求和)
print(sum(matrix6.diagonal()))

# 创建一个求解特征值、特征向量的矩阵
matrix7 = np.array([[1, -1, 3], [1, 1, 6], [3, 8, 9]])

# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(matrix7)

# 查看特征值
print(eigenvalues)

# 查看特征向量
print(eigenvectors)

# 构造两个点积(数量积)所需向量
vector_a = np.array([1, 2, 3])
vector_b = np.array([4, 5, 6])

# 计算点积
print(np.dot(vector_a, vector_b))

# Python 3.5+ 版本可以这样求解点积
print(vector_a @ vector_b)

# 构造两个可用于加减的矩阵
matrix_a = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 2]])
matrix_b = np.array([[1, 3, 1], [1, 3, 1], [1, 3, 8]])

# 两矩阵相加
print(np.add(matrix_a, matrix_b))

# 两矩阵相减
print(np.subtract(matrix_a, matrix_b))

# 直接用+/-也可以做矩阵加减
print(matrix_a + matrix_b)
print(matrix_a - matrix_b)

# 构造两个可用于乘法的小矩阵
matrix_c = np.array([[1, 1], [1, 2]])
matrix_d = np.array([[1, 3], [1, 2]])

# 两矩阵相乘
print(np.dot(matrix_c, matrix_d))

# Python 3.5+ 版本可以这样求解矩阵乘法
print(matrix_c @ matrix_d)

# 我们也可以把两矩阵对应元素相乘,而非矩阵乘法
print(matrix_c * matrix_d)

# 创建一个用于求逆的矩阵
matrix8 = np.array([[1, 4], [2, 5]])

# 计算矩阵的逆
print(np.linalg.inv(matrix8))

# 验证一个矩阵和它的逆矩阵相乘等于I(单位矩阵)
print(matrix8 @ np.linalg.inv(matrix8))

测试结果:

(2, 0) 3
  (1, 1) 1
  (1, 1) 1
  (2, 0) 3
3
5
[1 2 3 4 5 6]
[1 2 3]
[4 5 6]
6
[[1 2 3]
 [4 5 6]]
[[2]
 [5]
 [8]]
[2 5 8]
(3, 4)
12
2
[[101 102 103]
 [104 105 106]
 [107 108 109]]
[[1 2 3]
 [4 5 6]
 [7 8 9]]
[[201 202 203]
 [204 205 206]
 [207 208 209]]
9
1
[7 8 9]
[3 6 9]
5.0
6.666666666666667
2.581988897471611
[4. 5. 6.]
[0.66666667 0.66666667 0.66666667]
[[ 1  2  3  4  5  6]
 [ 7  8  9 10 11 12]]
12
[[ 1  2  3  4  5  6  7  8  9 10 11 12]]
[ 1  2  3  4  5  6  7  8  9 10 11 12]
[[1 4 7]
 [2 5 8]
 [3 6 9]]
[1 2 3 4 5 6]
[[1]
 [2]
 [3]
 [4]
 [5]
 [6]]
[1 2 3 4 5 6 7 8 9]
[[1 2 3 4 5 6 7 8 9]]
2
0.0
[1 4 9]
[2 6]
[2 8]
14
14
[13.55075847  0.74003145 -3.29078992]
[[-0.17622017 -0.96677403 -0.53373322]
 [-0.435951    0.2053623  -0.64324848]
 [-0.88254925  0.15223105  0.54896288]]
32
32
[[ 2  4  2]
 [ 2  4  2]
 [ 2  4 10]]
[[ 0 -2  0]
 [ 0 -2  0]
 [ 0 -2 -6]]
[[ 2  4  2]
 [ 2  4  2]
 [ 2  4 10]]
[[ 0 -2  0]
 [ 0 -2  0]
 [ 0 -2 -6]]
[[2 5]
 [3 7]]
[[2 5]
 [3 7]]
[[1 3]
 [1 4]]
[[-1.66666667  1.33333333]
 [ 0.66666667 -0.33333333]]
[[1.00000000e+00 0.00000000e+00]
 [1.11022302e-16 1.00000000e+00]]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 在python Numpy中求向量和矩阵的范数实例

    np.linalg.norm(求范数):linalg=linear(线性)+algebra(代数),norm则表示范数. 函数参数 x_norm=np.linalg.norm(x, ord=None, axis=None, keepdims=False) ①x: 表示矩阵(也可以是一维) ②ord:范数类型 向量的范数: 矩阵的范数: ord=1:列和的最大值 ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根 ord=∞:行和的最大值 ③axis:处理类型 axis=1表

  • Python使用numpy产生正态分布随机数的向量或矩阵操作示例

    本文实例讲述了Python使用numpy产生正态分布随机数的向量或矩阵操作.分享给大家供大家参考,具体如下: 简单来说,正态分布(Normal distribution)又名高斯分布(Gaussian distribution),是一个在数学.物理及工程等领域都非常重要的概率分布,在统计学的许多方面有着重大的影响力.一般的正态分布可以通过标准正态分布配合数学期望向量和协方差矩阵得到.如下代码,可以得到满足一维和二维正态分布的样本. 示例1(一维正态分布): # coding=utf-8 '''

  • Numpy 将二维图像矩阵转换为一维向量的方法

    以下的例子,将32x32的二维矩阵,装换成1x1024的向量 def image2vector (filename): returnVect=zeros((1,1024)) f=open(filename) for i in range (32): lineStr =fr.readline() for j in range (32): returnVect[0,32*i*j]=int(lineStr[j]) return returnVect 以上这篇Numpy 将二维图像矩阵转换为一维向量的方

  • 关于numpy中np.nonzero()函数用法的详解

    np.nonzero函数是numpy中用于得到数组array中非零元素的位置(数组索引)的函数.一般来说,通过help(np.nonzero)能够查看到该函数的解析与例程.但是,由于例程为英文缩写,阅读起来还是很费劲,因此,本文将其英文解释翻译成中文,便于理解. 解释 nonzero(a) 返回数组a中非零元素的索引值数组. (1)只有a中非零元素才会有索引值,那些零值元素没有索引值: (2)返回的索引值数组是一个2维tuple数组,该tuple数组中包含一维的array数组.其中,一维arra

  • 对numpy中array和asarray的区别详解

    array和asarray都可以将结构数据转化为ndarray,但是主要区别就是当数据源是ndarray时,array仍然会copy出一个副本,占用新的内存,但asarray不会. 举例说明: import numpy as np #example 1: data1=[[1,1,1],[1,1,1],[1,1,1]] arr2=np.array(data1) arr3=np.asarray(data1) data1[1][1]=2 print 'data1:\n',data1 print 'ar

  • 对numpy中的where方法嵌套使用详解

    如同for循环一样,numpy中的where方法可以实现嵌套功能.这是简化嵌套式矩阵逻辑的一个很好的方法. 假设有一个矩阵,需要把小于0的元素改成-1,大于0的元素改成1,而等于0的时候不做修改. 那么,对应的代码示范如下: #!/usr/bin/python import numpy as np data = np.random.randn(4,5) data1 =np.where(data > 0,1, np.where(data <0,-1,0)) print("dataval

  • 对numpy中的数组条件筛选功能详解

    在程序设计中,时常会遇到数据的唯一化.相同.相异信息的提取等工作,在格式化的向量存储矩阵中南,numpy能够提供比较不错的快速处理功能. 1,唯一化的实现: In [63]: data = np.array(['int','float','int','boolean','double','boolean']) In [64]: data Out[64]: array(['int', 'float', 'int', 'boolean', 'double', 'boolean'], dtype='|

  • 关于numpy中eye和identity的区别详解

    两个函数的原型为: np.identity(n, dtype=None) np.eye(N, M=None, k=0, dtype=<type 'float'>): np.identity只能创建方形矩阵 np.eye可以创建矩形矩阵,且k值可以调节,为1的对角线的位置偏离度,0居中,1向上偏离1,2偏离2,以此类推,-1向下偏离.值绝对值过大就偏离出去了,整个矩阵就全是0了. 以上这篇关于numpy中eye和identity的区别详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希

  • python使用numpy中的size()函数实例用法详解

    在python中,提到如何计算多维数组和矩阵,那一定会想到numpy.numpy定义了矩阵和数组,为它们提供了相关的运算.size中文解释为大家.尺寸的意思,如果想要统计矩阵元素个数,使用size()函数就可以解决. 1.Numpy size()函数 主要是用来统计矩阵元素个数,或矩阵某一维上的元素个数的函数. 2.使用语法 numpy.size(a, axis=None) 3.使用参数 a:输入的矩阵 axis:int型的可选参数,指定返回哪一维的元素个数.当没有指定时,返回整个矩阵的元素个数

  • Numpy中的shape函数的用法详解

    shape函数的功能是读取矩阵的长度,比如shape[0]就是读取矩阵第一维度的长度,相当于行数.它的输入参数可以是一个整数表示维度,也可以是一个矩阵.shape函数返回的是一个元组,表示数组(矩阵)的维度,例子如下: 1. 数组(矩阵)只有一个维度时,shape只有shape[0],返回的是该一维数组(矩阵)中元素的个数,通俗点说就是返回列数,因为一维数组只有一行,一维情况中array创建的可以看做list(或一维数组),创建时用()和[ ]都可以,多维就不可以这样子了,这里使用[ ],请看下

  • 在Python3 numpy中mean和average的区别详解

    mean和average都是计算均值的函数,在不指定权重的时候average和mean是一样的.指定权重后,average可以计算一维的加权平均值. 具体如下: import numpy as np a = np.array([np.random.randint(0, 20, 5), np.random.randint(0, 20, 5)]) print('原始数据\n', a) print('mean函数'.center(20, '*')) print('对所有数据计算\n', a.mean(

  • 对numpy中的transpose和swapaxes函数详解

    transpose() 这个函数如果括号内不带参数,就相当于转置,和.T效果一样,而今天主要来讲解其带参数. 我们看如下一个numpy的数组: `arr=np.arange(16).reshape((2,2,4)) arr= array([[[ 0, 1, 2, 3], [ 4, 5, 6, 7]], [[ 8, 9, 10, 11], [12, 13, 14, 15]]]) ` 那么有: arr.transpose(2,1,0) array([[[ 0, 8], [ 4, 12]], [[ 1

  • numpy中的converters和usecols用法详解

    目录 方法一:使用usecols 方法二:使用numpy 方法三:使用切片区间 总结: 用Python打开Excel数据,读取时需要将”学号“和“ID"转换成字符,以便后续操作 df = pd.read_excel(path, converters={'学号': str, 'ID': str}) 以下是我的经历来体会: 我在从Excel读入python的数据时,发现读出的是空值: import pandas as pd df=pd.read_excel("D:/Python/05Dat

随机推荐