我正在尝试创建一个函数,它需要两个输入。一个输入是矩阵(n*m),第二个输入是K,K是一个整数值。细胞A[3][2]与A[1][4]之间的距离为|1-3| + |4-2| = 4。函数的预期输出是细胞距离大于K的细胞数。
这里的单元格是给定矩阵A中的每个条目。例如,A是一个单元格,它在矩阵中的条目值为1。
我创建了这样一个函数:
A = [[1, 0, 0],
[0, 0, 0],
[0, 0, 1],
[0, 1, 0]]
def findw(K, matrix):
m_c = matrix.copy()
result = 0
for i, j in zip(range(len(matrix)), range(len(m_c))):
for k, l in zip(range(len(matrix[i])), range(len(m_c[j]))):
D = abs(i - l) + abs(j - k)
print(i, k)
print(j, l)
print(D)
if D > K:
result += 1
return result
findw(1, A)对于给定的矩阵A(K=1),上述函数的输出为9。但我期望3。从输出中我也意识到,对于两个矩阵,我的函数总是取相同的值,例如(0,0)或(1,0)等。参见下面的打印输出。
findw(1, A)
0 0
0 0
0
0 1
0 1
2
0 2
0 2
4
1 0
1 0
2
1 1
1 1
0
1 2
1 2
2
2 0
2 0
4
2 1
2 1
2
2 2
2 2
0
3 0
3 0
6
3 1
3 1
4
3 2
3 2
2
Out[120]: 9看起来,我的函数不迭代两个矩阵的索引不同的单元格。例如,matrix[0][0]和m_c[0][1]。
我怎样才能解决这个问题?
发布于 2021-08-17 12:15:48
假设只有您所关心的值为1的位置,您可以首先枚举这些索引,然后循环遍历这些东西的对。迭代工具是这里使用的一个自然工具:
from itertools import product, combinations
def D(p,q):
i,j = p
k,l = q
return abs(i-k) + abs(j-l)
def findw(k,matrix):
m = len(matrix)
n = len(matrix[0])
result = 0
indices = [(i,j) for i,j in product(range(m),range(n)) if matrix[i][j] == 1]
for p,q in combinations(indices,2):
d = D(p,q)
if d > k:
print(p,q,d)
result += 1
return result
#test:
A = [[1, 0, 0],
[0, 0, 0],
[0, 0, 1],
[0, 1, 0]]
print(findw(1, A))输出:
(0, 0) (2, 2) 4
(0, 0) (3, 1) 4
(2, 2) (3, 1) 2
3https://stackoverflow.com/questions/68816459
复制相似问题