Как сравнить внутри массива? - PullRequest
0 голосов
/ 06 апреля 2020

У меня есть этот массив:

array([[4798, 1369, 4139, ..., 2910, 2901,    0],
       [   2, 3161, 1343, ..., 2085, 2065, 2399],
       [ 546,  506,  614, ..., 1874, 1859, 4799],
       [   0,  634, 1341, ..., 1886, 1871, 4799]], dtype=int64)

И я вижу, что в последних строках есть два равных числа (4799). Я хочу сделать функцию, которая сравнивает соседние строки и возвращает массив или список с равными числами. Я не знаю, как это сделать. Я пытаюсь сделать это с for, но когда у меня самый большой массив, этот метод очень медленный.

Ответы [ 2 ]

2 голосов
/ 06 апреля 2020

Допустим, a - это ваш массив. Затем попробуйте следующее, которое может помочь,

def equalnumbers(a):
    row,col = np.where((a[1:,:]-a[:-1,:]) ==0)
    return a[row,col]

Пример пробной версии:

Обратите внимание, что у массива, который я использую, есть два числа, которые имеют равные в соседней строке. Также есть число 0 дважды, но в несмежных строках!

import numpy as np
a = np.array([[4798, 1369, 4139, 2910, 2901, 0],
             [4798, 3161, 1343, 2085, 2065, 2399],
             [546,  506,  614, 1874, 1859, 4799],
             [0,  634, 1341, 1886, 1871, 4799]]) 

equalnumbers(a)

Вывод:

array([4798, 4799])

Функция вернула только равные числа из соседних строк, а не 0, который присутствует в несмежных рядах. Надеюсь, это поможет.

1 голос
/ 06 апреля 2020

Я делаю следующие предположения, чтобы ответить на ваш вопрос:

  • вам не нужно определять, как часто значение в строке A и строке B
  • вы хотите сравнить одна строка с ОДНОЙ другой строкой, строка для строки
  • порядок чисел внутри обеих сравниваемых строк не имеет значения (если порядок имеет значение, следует использовать numpy .equal ())

Сначала используйте функцию set() для обеих строк, которые вы хотите сравнить. Затем используйте оператор пересечения & на обоих множествах. Возвращает новый набор с элементами, которые являются общими для обоих наборов Python Документы - 8.7. комплекты .

for i in range(len(array)):
    # Start at i+1 to prevent double comparison of row pairs
    for j in range(i+1, len(array)):  
        set_a = set(array[i])
        set_b = set(array[j])
        intersection = set_a & set_b
...