Как разделить одну матрицу на две матрицы в Python? - PullRequest
0 голосов
/ 11 апреля 2019

У меня есть одна матрица как А. Размер А составляет 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 содержит только значения «1» матрицы A.

2 - матрица N содержит только значения «-1» матрицы A.

3 - размер матрицы P и матрицы N равен 8 * 8 и (матрица A = матрица P + матрица N).

Буду очень признателен, если вы меня направите.

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Вы можете сделать это, используя списки:

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]]

Добавление кучных массивов (матриц) вместе сродни сложению регулярных скалярных переменных:

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]]
1 голос
/ 11 апреля 2019
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]]
1 голос
/ 11 апреля 2019
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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...