У меня есть два массива 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]
Я не знаю, почему это!
Кто-нибудь может объяснить?
Спасибо
Попробуйте 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. Тем не менее, ответ правильный, что мне нужно, и я принимаю его как решение. Большое спасибо
Если вы просто скажете, что хорошо, 94,0 равно 94,3, тогда вы можете использовать операцию вроде округления и округления их всех, чтобы получить целые числа (прежде чем сравнивать их). В противном случае вы сохраняете isclose, но настраиваете отношение в зависимости от того, что вы считаете равным. Спасибо:)
Это двойная петля. И один из ваших циклов имеет 5 строк, а другой - 17. 5 * 17 = 85 Он сравнивает каждую строку вашего первого массива с каждой строкой вашего второго.