我有一个矩阵,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)。
如果您引导我,我将不胜感激。
答案 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]]