python中numpy矩阵运算等整理

本文详细介绍了NumPy中array和matrix对象的乘法运算区别,包括数量积与矩阵乘法的实现方法,并深入探讨了数组转置的不同方式,如transpose方法、T属性及swapaxes方法的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一  array对象乘法运算

import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([[4,3],[2,1]])
print(a*b)
print(np.matmul(a,b))

import numpy as np
a=np.array([[1,2],[3,4]])
b=np.array([4,3])
print(a*b)
print(np.matmul(a,b))

 

 

 

可以看到, array对象的 * 代表的并不是矩阵的乘法运算(矢量积),而是简单的数量积(即对应位置元素相乘)。

如果在array对象上要进行严格的矩阵乘法,即矢量乘法,则必须使用.dot()或者.matmul()函数,两者是一样的。 

#   不过有时也不一定,在聚宽平台写策略时发现,使用matmul报错,如下:

把 matmul 换成 dot 就可以了

二  matrix对象乘法运算

与array对象反过来, matirx对象的 a*b 代表的是矩阵的乘法运算,如果要计算简单的数量积,要用np.multiply(a,b)计算。

import numpy as np
a=np.mat([[1,2],[3,4]])     # 也可以  a=np.mat('1,2;3,4')
b=np.mat([[4,3],[2,1]])     # 也可以  b=np.mat('4,3;2,1')
print(a*b)
print(np.matmul(a,b))
print(np.multiply(a,b))

 

import numpy as np
a=np.mat('1,2;3,4')
b=np.mat([[4],[3]])          # 注意,是2*1矩阵,不能用 b=np.mat([4,3])
# b=np.mat('4;3')             # 等价形式,但注意,是2*1矩阵,不能用 b=np.mat('4,3')
print(a*b)
print(np.matmul(a,b))
print(np.multiply(a,b))

 

三、转置(transpose)和轴对换

转置可以对数组进行重置,返回的是源数据的视图(不会进行任何复制操作)。

转置有三种方式,transpose方法、T属性以及swapaxes方法。

1 .T,适用于一、二维数组

In [1]: import numpy as np

In [2]: arr = np.arange(20).reshape(4,5)#生成一个4行5列的数组

In [3]: arr
Out[3]:
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

In [4]: arr.T #求转置
Out[4]:
array([[ 0,  5, 10, 15],
       [ 1,  6, 11, 16],
       [ 2,  7, 12, 17],
       [ 3,  8, 13, 18],
       [ 4,  9, 14, 19]])

2. 高维数组

对于高维数组,transpose需要用到一个由轴编号组成的元组,才能进行转置。

这里,着实好好理解了一下。开始的时候怎么都想不明白。因为他跟矩阵转置理解起来不太一样。

主要参考:
AbstractSky的博客
Albert Chen
经管之家

对多维数组来说,确定最底层的一个基本元素位置需要用到的索引个数即是维度。这句话的理解可以结合我索引和切片的那篇文章理解。

我是这样的理解的,比如说三维的数组,那就对维度进行编号,也就是0,1,2。这样说可能比较抽象。这里的0,1,2可以理解为对shape返回元组的索引。
比如:

In [59]: arr1 = np.arange(12).reshape(2,2,3)

In [60]: arr1
Out[60]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],

       [[ 6,  7,  8],
        [ 9, 10, 11]]])

In [61]: arr1.shape #看形状
Out[61]: (2, 2, 3) #说明这是一个2*2*3的数组(矩阵),返回的是一个元组,可以对元组进行索引,也就是0,1,2
形状索引
20
21
32

所以说,transpose参数的真正意义在于这个shape元组的索引。

那么它的转置就应该是


In [62]: arr1.transpose((1,0,2))
Out[62]:
array([[[ 0,  1,  2],
        [ 6,  7,  8]],

       [[ 3,  4,  5],
        [ 9, 10, 11]]])

比如,数值6开始的索引是[1,0,0],变换后变成了[0,1,0]
这也说明了,transpose依赖于shape

但是,对于为什么转置最后一个索引是不动的,颇为不解。数组或者说矩阵的这块有点太抽象了。虽然我线代成绩不错,但是这玩意不太一样啊。

3.swapaxes

虽然还有点不解的地方,但是,理解了上方那部分之后,swapaxes方法也就很好理解了。它接受一对轴编号。进行轴对换。其实也就是shape参数。

In [67]: arr2 = np.arange(16).reshape(2,2,4)           
                                                       
In [68]: arr2                                          
Out[68]:                                               
array([[[ 0,  1,  2,  3],                              
        [ 4,  5,  6,  7]],                             
                                                       
       [[ 8,  9, 10, 11],                              
        [12, 13, 14, 15]]])                            
                                                       
In [69]: arr2.shape                                    
Out[69]: (2, 2, 4)                                     
                                                       
In [70]: arr2.swapaxes(1,2)                            
Out[70]:                                               
array([[[ 0,  4],                                      
        [ 1,  5],                                      
        [ 2,  6],                                      
        [ 3,  7]],                                     
                                                       
       [[ 8, 12],                                      
        [ 9, 13],                                      
        [10, 14],                                      
        [11, 15]]])   

In [4]: arr2.swapaxes(1,0)#转置,对比transpose(1,0,2)
Out[4]:
array([[[ 0,  1,  2,  3],
        [ 8,  9, 10, 11]],

       [[ 4,  5,  6,  7],
        [12, 13, 14, 15]]])                                 
<think>好的,用户想用PythonNumPy实现矩阵的横轴纵轴元素交换,也就是矩阵转置。我需要根据提供的引用资料来整理答案。首先,引用[1]提到了三种方法:使用Numpy的transpose方法或T属性、列表推导式、zip函数。引用[2]到[4]详细说明了Numpy的具体操作,比如np.array创建矩阵,T属性的使用,以及transpose方法的应用。 用户的问题明确要求使用NumPy,所以可能需要优先介绍Numpy的方法。引用[1]中的方法一和方法二、三都是可行的,但考虑到用户可能更倾向于NumPy的高效性,应该重点讲解transpose和T属性。同时,引用[4]中的例子展示了T属性的使用,直接a1.T就可以转置,非常方便。 另外,用户提到“横轴纵轴交换”,需要确认转置的定义是否正确。转置确实是行列索引交换,所以没问题。需要确保示例代码正确,比如如何创建矩阵,应用转置方法,并输出结果。 可能还需要比较不同方法的优缺点,比如Numpy的方法更高效,适合处理大型矩阵,而列表推导式和zip函数虽然可以用于小矩阵,但效率不高。同时,引用[3]中的例子展示了转置在数据分析中的应用,比如协方差矩阵的计算,但用户可能暂时不需要这部分,但可以作为扩展提及。 需要检查是否有遗漏的方法,比如np.transpose()函数,是否有参数可以调整,比如axes参数,但用户可能只需要基本的转置,所以axes默认即可。另外,是否需要处理高维数组的转置?用户的问题是关于矩阵,应该是二维的,所以可以不用涉及高维情况。 最后,生成相关问题需要考虑用户可能的后续疑问,比如性能比较、其他转置方法的应用场景,或者转置在数学中的意义等。确保问题相关且有助于用户深入学习。</think>在Python中使用NumPy进行矩阵转置有三种常用方法,以下是详细操作步骤: ### 方法一:使用NumPy的T属性(推荐) ```python import numpy as np # 创建2x3矩阵 matrix = np.array([[1, 2, 3], [4, 5, 6]]) # 通过.T属性转置 transposed = matrix.T print("转置结果:\n", transposed) ``` 输出为: $$ \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \\ \end{bmatrix} $$ ### 方法二:使用transpose()方法 ```python # 使用transpose()方法转置 transposed = matrix.transpose() ``` ### 方法三:使用np.transpose()函数 ```python # 使用函数式转置 transposed = np.transpose(matrix) ``` ### 数学原理 矩阵转置是线性代数基本运算,将$m \times n$矩阵$A$转换为$n \times m$矩阵$A^T$,满足: $$ (A^T)_{ij} = A_{ji} $$ 例如原矩阵: $$ \begin{bmatrix} a & b \\ c & d \\ e & f \\ \end{bmatrix} $$ 转置后变为: $$ \begin{bmatrix} a & c & e \\ b & d & f \\ \end{bmatrix} $$ ### 性能对比 | 方法 | 时间复杂度 | 适用场景 | |-----------|-------|---------------| | .T属性 | O(1) | 大型矩阵(推荐) | | transpose() | O(1) | 需要链式调用时 | | 列表推导式 | O() | 小型矩阵(非NumPy环境) | [^1][^4]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值