Найдите элементы, имеющие одинаковое значение в двух массивах numpy python

У меня есть два массива numpy A и B, я хочу найти в B, какие строки имеют то же значение (второй и третий столбцы), что и A. Например, в B я обнаружил, что 2 и 3 (в первой строке) и 8 и 9 (в 4 ряду). Поэтому мне нужно распечатать строку с одинаковыми значениями: 0 и 3.

A = np.array([[1, 2, 3],            
              [7, 8, 9]]) 

B = np.array([[0, 2, 3],
               [4, 5, 6],
               [4, 5, 6],               
               [1, 8, 9]])

Это мой подход:

results = []
for k in range(0,A.shape[0]):
    i = np.where(np.all(np.isclose(B[:,1:3],A[k,1:3], atol=0.5), axis=1))[0]
    #print(i)
    for i in i:
        results.append(i)
print(results)

Можно распечатать [0, 3] (что правильно)

Но когда я меняю A на

A = np.array([[ 111,  67108864,  33554495,  100663297,  50331709,  32,  16777216],
 [ 112,  67108864,  33554475,  100663297,  50331709,  48,  16777248],
 [ 113,  67108864,  33554455,  100663297,  50331709,  16,  16777232],
 [ 114,  67108864,  33554435,  100663297,  50331709,  8,  16777264],
 [ 120,  67108865,  33554455,  100663297,  50331709,  40,  16777224]]) 

И Б к

B = np.array([[ 54, 67108864, 33554495, 100663297, 50331711, 0, 16777216],
 [ 55, 67108864, 33554493, 100663297, 50331710, 32, 16777248],
 [ 56, 67108864, 33554491, 100663297, 50331709, 16, 16777232],
 [ 57, 67108864, 33554489, 100663297, 50331708, 48, 16777264],
 [ 58, 67108864, 33554487, 100663297, 50331707, 8, 16777224],
 [ 59, 67108864, 33554485, 100663297, 50331706, 40, 16777256],
 [ 60, 67108864, 33554483, 100663297, 50331705, 24, 16777240],
 [ 61, 67108864, 33554481, 100663297, 50331704, 56, 16777272],
 [ 62, 67108864, 33554479, 100663297, 50331703, 4, 16777220],
 [ 63, 67108864, 33554477, 100663297, 50331702, 36, 16777252],
 [ 64, 67108864, 33554475, 100663297, 50331701, 20, 16777236],
 [ 65, 67108864, 33554473, 100663297, 50331700, 52, 16777268],
 [ 66, 67108864, 33554471, 100663297, 50331699, 12, 16777228],
 [ 67, 67108864, 33554469, 100663297, 50331698, 44, 16777260],
 [ 68, 67108864, 33554467, 100663297, 50331697, 28, 16777244],
 [ 69, 67108864, 33554465, 100663297, 50331696, 60, 16777276],
 [ 70, 67108864, 33554463, 100663297, 50331695, 2, 16777218]]) 

Однако я получил следующие результаты:

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 1, 2, 3, 4, 5, 6, 7 , 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 , 16, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 1, 2, 3, 4, 5, 6 , 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]

Я не знаю, почему это!

Кто-нибудь может объяснить?

Спасибо

Это двойная петля. И один из ваших циклов имеет 5 строк, а другой - 17. 5 * 17 = 85 Он сравнивает каждую строку вашего первого массива с каждой строкой вашего второго.

Shaig Hamzaliyev 18.11.2022 15:32
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте np.equal вместо np.isclose. Isclose действителен в случае, когда два массива равны по элементам в пределах допуска, поэтому он не работает в вашем случае:

for k in range(0,A.shape[0]):
      i = np.where(np.all(np.equal(B[:,1:3],A[k,1:3]), axis=1))[0]
      for i in i:
          results.append(i)

На самом деле мне нужен np.isclose для номера, как 67108864.4, и я не знаю, как обойтись без np.isclose. Тем не менее, ответ правильный, что мне нужно, и я принимаю его как решение. Большое спасибо

fpga 18.11.2022 15:34

Если вы просто скажете, что хорошо, 94,0 равно 94,3, тогда вы можете использовать операцию вроде округления и округления их всех, чтобы получить целые числа (прежде чем сравнивать их). В противном случае вы сохраняете isclose, но настраиваете отношение в зависимости от того, что вы считаете равным. Спасибо:)

Eirini Kotzia 18.11.2022 15:40

Другие вопросы по теме