我是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的新手,所以如果您能告诉我该怎么做,我将不胜感激。 非常感谢
答案 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。它使用zip
和enumerate
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))