Функция для использования индексов в матрице

#python #matrix

Вопрос:

Я пытаюсь создать функцию, которая принимает два входа. Один вход-матрица (n*m), а второй-K. K-целочисленное значение. Расстояние между ячейками A[3][2] и A[1][4] есть |1-3| |4-2| = 4 . Ожидаемый результат функции-это количество ячеек с расстоянием между ячейками больше K.

Ячейка здесь-это каждая запись в данной матрице A. Например, [0][0] — это ячейка, и она имеет значение 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]

Как я могу решить эту проблему?

Комментарии:

1. это была опечатка. Теперь я это исправил. на самом деле это[3][2] и[1][4].

2. Каким образом сама матрица (а не только ее размеры) вообще имеет отношение к проблеме? Поиск с применением грубой силы, а не немного арифметики m,n,k , кажется в корне неэффективным. В качестве возможной стратегии достаточно легко получить общее количество пар клеток. Вычтите из этого количество всех пар ячеек, которые находятся в пределах порогового расстояния.

3. Рассмотрим матрицу-это сельскохозяйственная земля, на которой мы хотим установить ветряные трубы. значение ячейки с » 1 » представляет среду обитания птиц, и мы не хотим внедрять ветровые турбины ближе к среде обитания птиц. насколько далеко путь определяется «K». Могу я проверить, как получить общее количество различных пар из обеих матриц?

4. Итак, вы пытаетесь найти пары ячеек, обе из которых имеют значение 1 , расстояние между которыми превышает пороговое значение? Это условие отсутствует в описании вашей проблемы, а также в вашем коде (вы никогда не проверяете значение в матрице).

5. @mkpisk почему вы связываете 3 с K=1? если вы хотите вычислить расстояние[2][0] и[i][j], вы получаете abs(2-i) j и решаете (вручную) неравенство для счетчика abs(2-i) j > 1… но для этого особого случая вы получаете более 3 решений… так ты в этом уверен? … ваша первая молния даст вам только диагональный элемент

Ответ №1:

Работая в предположении 1 , что вас интересуют только позиции, которые имеют значение, вы можете сначала перечислить эти индексы, а затем перебрать пары таких вещей. itertools-это естественный инструмент для использования здесь:

 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
3
 

Комментарии:

1. есть ли способ, которым я задаю условие для ячейки (=1) в комбинациях вместо определения в «индексах»?

2. @mkpisk Вы можете удалить if часть определения понимания indices , а затем проверить любое условие, которое вы хотите проверить, в цикле над комбинациями.