【问题标题】:Matrix operations in PythonPython中的矩阵运算
【发布时间】:2020-02-28 16:43:39
【问题描述】:

我想写一个函数,让它接受一个矩阵、一个行号和一个列号。此后仅使用行操作获得矩阵,使得 A(i,j) 位置中的 1 和第 i 列中所有其他位置中的零。 我是 Python 新手。请给我一些帮助。谢谢。

我是这样开始的,

import numpy as np

def A = np.array([B])#矩阵B尚未提供

def i = A[i,:]

def j= A[:,j]

但这似乎不起作用!

【问题讨论】:

  • 为什么你需要一个输入矩阵来摆脱它,只放一个 1 和零,只为大小?
  • @azro,我认为您编辑之前的原始帖子确实显示了很多问题,请考虑恢复它。
  • 不是很清楚。您是否正在尝试进行枢轴操作(如在 Gauss-Jordan 中)?如果是这样,您的代码似乎与问题没有太大关系。我不知道为什么你会期望它工作。在编写代码之前,请确保您了解您尝试实现的算法。
  • def 在 Python 中定义了一个函数,而不是一个变量。在解决这个特定问题之前,我会先从基本的 Python 教程开始

标签: python arrays numpy matrix-multiplication


【解决方案1】:

设置:

import numpy as np          
from functools import reduce

N = 6
A = np.random.randint(0,10,(N,N))
i,j = np.random.randint(0,N,2)
A
# array([[8, 9, 8, 1, 9, 4],
#        [0, 3, 5, 4, 5, 2],
#        [2, 7, 4, 6, 2, 7],
#        [9, 8, 1, 5, 1, 9],
#        [0, 1, 0, 8, 0, 3],
#        [3, 4, 5, 0, 6, 7]])
i,j
# (5, 1)

助手:

I = np.identity(N)                    
e = I[:,None]      # standard base row vectors                   
eT = I[...,None]   # standard base column vectors                                             

行操作:

rowops = [I + eT[i]@e[i]*(1/A[i,j]-1)] + [I - (eT[k]*A[k,j])@(e[i]/A[i,j]) for k in range(6) if k!=i]                          

第一个缩放第 i 行。其他的从第 k 行减去第 i 行乘以一个因子。

让我们一一应用它们并跟踪第 j 列:

B = A.copy()                       
for r in reversed(rowops):
    print(B[:,j])
    B = r@B
# [9 3 7 8 1 4]
# [9. 3. 7. 8. 0. 4.]
# [9. 3. 7. 0. 0. 4.]
# [9. 3. 0. 0. 0. 4.]
# [9. 0. 0. 0. 0. 4.]
# [0. 0. 0. 0. 0. 4.]
print(B[:,j])
# [0. 0. 0. 0. 0. 1.]

现在让我们通过相乘将所有 rowop 组合成一个 op:

combined = reduce(np.matmul,rowops)

这在应用于A 时确实给出了相同的结果

np.allclose(combined@A,B)
# True

我们可以直接获得这个组合操作:

R = I + (eT[i]-A@eT[j])@e[i]/A[i,j]

检查:

np.allclose(combined,R)
# True

适用于A:

R@A
# array([[  1.25,   0.  ,  -3.25,   1.  ,  -4.5 , -11.75],
#        [ -2.25,   0.  ,   1.25,   4.  ,   0.5 ,  -3.25],
#        [ -3.25,   0.  ,  -4.75,   6.  ,  -8.5 ,  -5.25],
#        [  3.  ,   0.  ,  -9.  ,   5.  , -11.  ,  -5.  ],
#        [ -0.75,   0.  ,  -1.25,   8.  ,  -1.5 ,   1.25],
#        [  0.75,   1.  ,   1.25,   0.  ,   1.5 ,   1.75]])

【讨论】:

    【解决方案2】:

    `

    import numpy as np
    
    m = np.array([[1, 1, 1, 1],[2, 2, 2, 2],[3, 3, 3, 3]])
    
    
    def func(matrix, col, row):
        matrix[:, col] = 0
        matrix[row, col] = 1
    
    
    func(m, 1, 1)
    
    print(m)`
    

    希望对你有帮助:)

    【讨论】:

      猜你喜欢
      • 2017-09-26
      • 2016-01-16
      • 1970-01-01
      • 1970-01-01
      • 2013-03-15
      • 2019-06-27
      • 1970-01-01
      • 1970-01-01
      • 2015-10-02
      相关资源
      最近更新 更多