首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数在矩阵中使用索引。

函数在矩阵中使用索引。
EN

Stack Overflow用户
提问于 2021-08-17 11:23:17
回答 1查看 71关注 0票数 0

我正在尝试创建一个函数,它需要两个输入。一个输入是矩阵(n*m),第二个输入是K,K是一个整数值。细胞A[3][2]A[1][4]之间的距离为|1-3| + |4-2| = 4。函数的预期输出是细胞距离大于K的细胞数。

这里的单元格是给定矩阵A中的每个条目。例如,A是一个单元格,它在矩阵中的条目值为1。

我创建了这样一个函数:

代码语言:javascript
复制
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)等。参见下面的打印输出。

代码语言:javascript
复制
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]

我怎样才能解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-17 12:15:48

假设只有您所关心的值为1的位置,您可以首先枚举这些索引,然后循环遍历这些东西的对。迭代工具是这里使用的一个自然工具:

代码语言:javascript
复制
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))

输出:

代码语言:javascript
复制
(0, 0) (2, 2) 4
(0, 0) (3, 1) 4
(2, 2) (3, 1) 2
3
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68816459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档