遮罩两个平方矩阵

时间:2019-05-17 09:45:35

标签: python

我是python的新手,我不确定该怎么做。我有以下矩阵:

A=[[1,1,1],[1,1,1],[1,1,1]]
B=[[False,True,False],[True,False,True],[False,True,False]]

我想使用B将A转换为以下矩阵:

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

我确信它非常简单,但是,正如我所说,我是python的新手,所以如果您能告诉我该怎么做,我将不胜感激。 非常感谢

8 个答案:

答案 0 :(得分:1)

您最好的选择是使用numpy:

import numpy as np

data = np.array([[1, 2, 3,],
                 [4, 5, 6,],
                 [7, 8, 9,],])
mask = np.array([[False, True,  False,],
                 [True,  False, True,],
                 [False, True,  False,],])

filtered_data = data * mask

这导致filtered_data的结果:

array([[0, 2, 0],
       [4, 0, 6],
       [0, 8, 0]])

没有numpy,您可以使用嵌套列表理解来做到这一点,但是我敢肯定,如果可以选择的话,您会同意numpy解决方案更加清晰:

data = [[1, 2, 3,],
        [4, 5, 6,],
        [7, 8, 9,],]
mask = [[False, True,  False,],
        [True,  False, True,],
        [False, True,  False,],]

filtered_data = [[data_elem if mask_elem else 0 
                  for data_elem, mask_elem in zip(data_row, mask_row)]
                 for data_row, mask_row in zip(data, mask)]

给您filtered_data等于

[[0, 2, 0], [4, 0, 6], [0, 8, 0]]

答案 1 :(得分:0)

使用enumerate

例如:

A=[[1,1,1],[1,1,1],[1,1,1]]
B=[[False,True,False],[True,False,True],[False,True,False]]

for ind, val in enumerate(B):
    for sub_ind, sub_val in enumerate(val):
        A[ind][sub_ind] = int(sub_val)

print(A)

输出:

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

答案 2 :(得分:0)

有了numpy.multiply,您将得到想要的东西:

import numpy as np

A=[[1,1,1],[1,1,1],[1,1,1]]
B=[[False,True,False],[True,False,True],[False,True,False]]

np.multiply(A, B)

#array([[0, 1, 0],
#       [1, 0, 1],
#       [0, 1, 0]])

答案 3 :(得分:0)

你可以做

[ [int(y) for y in x]  for x in B ]

对布尔值进行int()

int(False)-> 0
int(True)-> 1

答案 4 :(得分:0)

循环的基本功能:

for i in range(len(A)):
    for j in range(len(A[0])):
        A[i][j]= int(B[i][j])*A[i][j]
print (A)

输出:

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

示例:

A=[[1,1,1],[1,1,1],[0,0,0]]
B=[[False,True,False],[True,False,True],[False,True,False]]

输出:

for i in range(len(A)):
    for j in range(len(A[0])):
        A[i][j]= int(B[i][j])*A[i][j]
print (A)

答案 5 :(得分:0)

尝试

A=[[1,1,1],[1,1,1],[1,1,1]]
B=[[False,True,False],[True,False,True],[False,True,False]]
X = [[x and y for x,y in zip(a,b)] for a,b in zip(A,B)]
C = [ [int(x) for x in c]  for c in X ]


print(C)

输出

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

答案 6 :(得分:0)

自此,您已要求A进行修改。这是一个解决方案,它不会创建新列表,而是会修改A。它使用zipenumerate

A=[[1,1,1],[1,1,1],[1,1,1]]
B=[[False,True,False],[True,False,True],[False,True,False]]

for x,y in zip(A,B):
    for x1,y1 in zip(enumerate(x),y):
        x[x1[0]] = int(y1)

print A

输出:

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

答案 7 :(得分:0)

如果您想使用A中的标志来修改B,可以这样:

A = [[1, 1, 1], [1, 1, 1], [1, 1, 1]]
B = [[False, True, False], [True, False, True], [False, True, False]]

C = [[int(A_el == B_el) for A_el, B_el in zip(A_ar, B_ar)] for A_ar, B_ar in zip(A, B)]

输出:

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

您还可以使用索引进行迭代:

C = [[int(A[i][j] == B[i][j]) for j in range(len(A[0]))] for i in range(len(A))