Возвращаемая разность двух 2D-массивов

0

Вопрос

У меня есть 2 2d массива, и я хотел бы вернуть все значения, которые отличаются во втором массиве, сохраняя при этом существующие размеры. Я сделал что-то вроде diff = arr2[np.nonzero(arr2-arr1)] работает, чтобы дать мне различные элементы, но как мне сохранить размеры и относительное положение элементов?

Пример Ввода:

arr1 = [[0 1 2]  arr2 = [[0 1 2]
        [3 4 5]          [3 5 5]
        [6 7 8]]         [6 7 8]]

Ожидаемый результат:

diff = [[0 0 0]
        [0 5 0]
        [0 0 0]]
numpy python
2021-11-24 05:35:35
4

Лучший ответ

2

Как насчет следующего:

import numpy as np

arr1 = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
arr2 = np.array([[0, 1, 2], [3, 5, 5], [6, 7, 8]])
diff = arr2 * ((arr2 - arr1) != 0)

print(diff)
# [[0 0 0]
#  [0 5 0]
#  [0 0 0]]

ПРАВКА: К моему удивлению, следующая первая версия моего ответа (исправленная OP) может быть быстрее:

diff = arr2 * np.abs(np.sign(arr2 - arr1))
2021-11-24 08:08:04

Ваш оригинальный ответ с использованием np.sign был для меня самым быстрым. Даже используя np.abs, чтобы исправить проблему, для которой, я полагаю, вы ее изменили. diff = arr2 * np.abs(np.sign(arr2-arr1))
nemi

@nemi Да, я понял, что результат был не таким, как вы хотели, когда разница отрицательная. В любом случае рад, что это сработало!
j1-lee
2

Если это массивы numpy, вы могли бы сделать

ans = ar1 * 0
ans[ar1 != ar2] = ar2[ar1 != ar2]
ans
# array([[0, 0, 0],
#        [0, 5, 0],
#        [0, 0, 0]])

Без numpy, вы можете использовать map

list(map(lambda a, b: list(map(lambda x, y: y if x != y else 0, a, b)), arr1, arr2))
# [[0, 0, 0], [0, 5, 0], [0, 0, 0]]

Данные

import numpy as np

arr1 = [[0, 1, 2], [3, 4, 5], [6, 7, 8]]
arr2 = [[0, 1, 2], [3, 5, 5], [6, 7, 8]]

ar1 = np.array(arr1)
ar2 = np.array(arr2)
2021-11-24 05:41:05

У меня был похожий подход. Вы могли бы использовать np.zeros(arr2.shape) или np.zeros_like(arr2) для построения массива с нулями. Хороший.
Ch3steR
2

Я удивлен, что никто не предложилnumpy.where метод:

diff = np.where(arr1!=arr2, arr2, 0)

Буквально, где arr1 и arr2 разные, принимают значения arr2, иначе принимают 0.

Выход:

array([[0, 0, 0],
       [0, 5, 0],
       [0, 0, 0]])
2021-11-24 05:59:56

Вы опубликовали сообщение за минуту до того, как я редактировал свой ответ с помощью np.where. Я могу откатить свою правку, если вы хотите.
Ch3steR

@Ch3steR нет, не волнуйся ;) на самом деле даже получи мой голос
mozway
1

np.copyto

Вы можете проверить неравенство между двумя массивами, а затем использоватьnp.copyto сnp.zeros/ np.zeros_like.

out = np.zeros(arr2.shape) # or np.zeros_like(arr2)
np.copyto(out, arr2, where=arr1!=arr2)
print(out)

# [[0 0 0]
#  [0 5 0]
#  [0 0 0]]

np.where

Вы можете использоватьnp.where и уточните x, y аргументы.

out = np.where(arr1!=arr2, arr2, 0)

# [[0 0 0]
#  [0 5 0]
#  [0 0 0]]
2021-11-24 05:45:12

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................