如何在python中将一个矩阵分为两个矩阵?

时间:2019-04-11 15:30:52

标签: python matrix

我有一个矩阵,A的大小为8 * 8。

A= [[ 0.  1.  0.  1.  1.  1.  0.  0.]
[ 0.  0.  1.  0.  0.  0.  0.  0.]
[ 0.  0.  0.  1. -1.  0.  0.  0.]
[ 0.  0.  0.  0.  0.  0. -1.  1.]
[ 0.  0.  0.  0.  0.  0. -1.  1.]
[ 0.  0.  0.  0.  0.  0.  1.  0.]
[ 0.  0.  0.  0.  0.  0.  0.  1.]
[-1.  0.  0.  0.  0.  0.  0.  0.]]

我想将A划分为两个矩阵(例如P,N):

1-矩阵P仅包含矩阵A的值“ 1”。

2-矩阵N仅包含矩阵A的值“ -1”。

3-矩阵P和矩阵N的大小分别为8 * 8和(矩阵A =矩阵P +矩阵N)。

如果您引导我,我将不胜感激。

3 个答案:

答案 0 :(得分:1)

from copy import deepcopy

# make copies of the original
P = deepcopy(A)
N = deepcopy(A)

# in P, keep only +1 
for i, row in enumerate(P):
    for j, val in enumerate(row):
        if val != 1:
              P[i][j] = 0

# in N, keep only -1
for i, row in enumerate(N):
    for j, val in enumerate(row):
        if val != -1:
              P[i][j] = 0

答案 1 :(得分:1)

您可以使用列表推导来做到这一点:

A = [[ 0,  1,  0,  1,  1,  1,  0,  0],
     [ 0,  0,  1,  0,  0,  0,  0,  0],
     [ 0,  0,  0,  1, -1,  0,  0,  0],
     [ 0,  0,  0,  0,  0,  0, -1,  1],
     [ 0,  0,  0,  0,  0,  0, -1,  1],
     [ 0,  0,  0,  0,  0,  0,  1,  0],
     [ 0,  0,  0,  0,  0,  0,  0,  1],
     [-1,  0,  0,  0,  0,  0,  0,  0]]

P  = [ [max(0,v) for v in line] for line in A]
N  = [ [min(0,v) for v in line] for line in A]

for line in P: print(line)
[0, 1, 0, 1, 1, 1, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 1, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 1]
[0, 0, 0, 0, 0, 0, 0, 0]

for line in N: print(line)
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, -1, 0, 0, 0]
[0, 0, 0, 0, 0, 0, -1, 0]
[0, 0, 0, 0, 0, 0, -1, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0]
[-1, 0, 0, 0, 0, 0, 0, 0]

您可以像这样将N和P加在一起:

NP = [ [n+p for n,p in zip(lineN,lineP)] for lineN,lineP in zip(N,P) ]

NP == A # True

for line in NP: print(line)
[0, 1, 0, 1, 1, 1, 0, 0]
[0, 0, 1, 0, 0, 0, 0, 0]
[0, 0, 0, 1, -1, 0, 0, 0]
[0, 0, 0, 0, 0, 0, -1, 1]
[0, 0, 0, 0, 0, 0, -1, 1]
[0, 0, 0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 1]
[-1, 0, 0, 0, 0, 0, 0, 0]

注意:您可能还需要研究numpy模块。它可以更快,更优雅地完成这些事情。

import numpy as np

A = np.array( [[ 0,  1,  0,  1,  1,  1,  0,  0],
               [ 0,  0,  1,  0,  0,  0,  0,  0],
               [ 0,  0,  0,  1, -1,  0,  0,  0],
               [ 0,  0,  0,  0,  0,  0, -1,  1],
               [ 0,  0,  0,  0,  0,  0, -1,  1],
               [ 0,  0,  0,  0,  0,  0,  1,  0],
               [ 0,  0,  0,  0,  0,  0,  0,  1],
               [-1,  0,  0,  0,  0,  0,  0,  0]])
P = np.maximum(0,A)
N = np.minimum(0,A)

print(P)
[[0 1 0 1 1 1 0 0]
 [0 0 1 0 0 0 0 0]
 [0 0 0 1 0 0 0 0]
 [0 0 0 0 0 0 0 1]
 [0 0 0 0 0 0 0 1]
 [0 0 0 0 0 0 1 0]
 [0 0 0 0 0 0 0 1]
 [0 0 0 0 0 0 0 0]]

print(N)
[[ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0 -1  0  0  0]
 [ 0  0  0  0  0  0 -1  0]
 [ 0  0  0  0  0  0 -1  0]
 [ 0  0  0  0  0  0  0  0]
 [ 0  0  0  0  0  0  0  0]
 [-1  0  0  0  0  0  0  0]]

将numpy数组(矩阵)加在一起就像添加常规标量变量一样:

print(P+N)
[[ 0  1  0  1  1  1  0  0]
 [ 0  0  1  0  0  0  0  0]
 [ 0  0  0  1 -1  0  0  0]
 [ 0  0  0  0  0  0 -1  1]
 [ 0  0  0  0  0  0 -1  1]
 [ 0  0  0  0  0  0  1  0]
 [ 0  0  0  0  0  0  0  1]
 [-1  0  0  0  0  0  0  0]]

答案 2 :(得分:1)

n = len(A[0]) # n = 8
# generate matrix 
N = [[0]*n for i in range(n)]
P = [[0]*n for i in range(n)]

for i in range(n):
    for j in range(n):
        if A[i][j] == 1:
            P[i][j] = 1
        elif A[i][j] == -1:
            N[i][j] = -1

输出:

print (P)
print (N)

[[0, 1, 0, 1, 1, 1, 0, 0], 
[0, 0, 1, 0, 0, 0, 0, 0],
[0, 0, 0, 1, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 1], 
[0, 0, 0, 0, 0, 0, 0, 1], 
[0, 0, 0, 0, 0, 0, 1, 0], 
[0, 0, 0, 0, 0, 0, 0, 1], 
[0, 0, 0, 0, 0, 0, 0, 0]]


[[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, -1, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, -1, 0], 
[0, 0, 0, 0, 0, 0, -1, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 0, 0], 
[-1, 0, 0, 0, 0, 0, 0, 0]]