#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
, а затем проверить любое условие, которое вы хотите проверить, в цикле над комбинациями.