Vrátí rozdíl dvou 2D matic

0

Otázka

Mám 2 2d pole a chtěl bych vrátit všechny hodnoty, které jsou odlišné ve druhé pole při zachování stávajících rozměrů. Udělal jsem něco jako diff = arr2[np.nonzero(arr2-arr1)] funguje mi rozdílné prvky, ale jak mám udržet rozměry a vzájemné polohy prvků?

Příklad Vstup:

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

Očekávaný výstup:

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

Nejlepší odpověď

2

Jak se o následující:

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]]

EDIT: Překvapivě pro mě, tyto první verze mé odpovědi (korekce OP) by mohl být rychlejší:

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

Vaše původní odpověď pomocí np.znak byl nejrychlejší pro mě. Dokonce i pomocí np.abs opravit problém, předpokládám, že jste to změnil. diff = arr2 * np.abs(np.sign(arr2-arr1))
nemi

@nemi Ano, jsem si uvědomil, že výsledek není to, co jsi chtěl, když rozdíl je negativní. Každopádně jsem rád, že to fungovalo!
j1-lee
2

Pokud jsou numpy pole, jsi to mohl udělat

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

Bez numpy, můžete použít 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]]

Údaje

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

Měl jsem podobný přístup. Můžete použít np.zeros(arr2.shape) nebo np.zeros_like(arr2) pro budování pole s nulami. Pěkný.
Ch3steR
2

Jsem překvapen, že nikdo navrhl numpy.where metoda:

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

Doslova, kde arr1 a arr2 jsou různé vzít hodnoty arr2, jiný se 0.

Výstup:

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

Napsal jste chvíli předtím, než jsem byl editace moje odpověď s np.where. Mohu vrátit můj upravit, pokud chcete.
Ch3steR

@Ch3steR ne, neboj ;) vlastně i můj hlas
mozway
1

np.copyto

Můžete zkontrolovat nerovnost mezi dvě pole a pak použít np.copyto s 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

Můžete použít np.where a zadejte, x, y args.

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

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

V jiných jazycích

Tato stránka je v jiných jazycích

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