2016-04-24 8 views
1

Ich habe versucht, die einzelnen Elemente von einem 2D-Array zu einem anderen zu kopieren. Mein Code ist wie folgt:Testen der Gleichheit zweier numper 2d Arrays

tp_matrix = np.array(tp_matrix) 
my_array = np.empty(shape = (tp_matrix.shape)) 

for x in range(tp_matrix.shape[0]): 
    for y in range(tp_matrix.shape[1]): 
     my_array[x][y] = tp_matrix[x][y] 


if(np.array_equal(my_array, tp_matrix)): 
    print('Equal') 
else: 
    print('Not equal') 

Allerdings sind die beiden Arrays aus irgendeinem Grund nicht gleich. Was ist das Problem hier und was kann ich tun, um es zu lösen?

Ich kann die Kopierfunktion von numpy nicht verwenden, da ich später Änderungen an einigen Elementen von my_array vornehmen möchte, wobei die anderen Werte mit denen von my_matrix übereinstimmen.

Edit: Beim Ausführen des Codes bekomme ich die folgende Meldung: FutureWarning: elementwise Vergleich fehlgeschlagen; Skalar wird stattdessen zurückgegeben, aber wird in der Zukunft einen elementweisen Vergleich durchführen Bedeutet das, dass etwas mit dem Datensatz (tp_matrix) nicht stimmt?

Edit 2: Ich habe versucht, die allclose und isclose Funktionen, aber ich bekomme diesen Fehler: TypeError: ufunc 'isfinite' nicht für die Eingabearten unterstützt, und die Eingänge konnten nicht sicher zu irgendwelchen unterstützten Typen nach dem Casting-Regel '' Safe '' Die Daten werden als Floats gespeichert. Auch ist es ein bisschen groß (399 x 5825).

Edit 3: Gelöst. Ich musste Python neu installieren.

+2

Sind die Elemente schwebend? Das Vergleichen von Schwimmern kann solche Effekte haben. Versuchen Sie https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.allclose.html#numpy.allclose. Im Allgemeinen sollte man Floats niemals auf Gleichheit testen. – JulienD

+0

Versuchen Sie'numpy.allclose() ', um Ihrem Gleichheits-Satz eine Toleranz zu geben. Auch wenn Sie mehr Informationen über Ihre Daten geben (vielleicht ein Beispiel) und was Sie damit machen wollen, gibt es vielleicht Lösungen, um eine "beste Kopie" zu erstellen. – armatita

+0

Ich bekomme "Gleich", wenn ich Ihren Code unter Verwendung einer Liste von Ganzzahlen und Gleitkommazahlen als die tp_matrix verwende. Was ist tp_matrix, die du benutzt? –

Antwort

3

Verwenden Sie np.allclose, um die (fast) Gleichheit von Float-Arrays zu testen, da die Float-Zahlen in einem Computer dargestellt werden.

Weitere Informationen Sie zum Beispiel lesen konnte "What Every Computer Scientist Should Know About Floating-Point Arithmetic"

+0

allclose gibt den in Edit 2 angezeigten Fehler an. – Ar254

+0

Was ist 'my_array.dtype'? – JulienD

+0

Probieren Sie 'my_array = my_array.astype (np.float64)' und das selbe für 'tp_matrix' aus – JulienD

0

Ich habe versucht zu imitieren, was Sie erleben und tat das folgende:

one = np.array([1,2,3]) 
two = np.array([one,one,one]) 
three = np.empty(shape=(two.shape)) 
for x in range(two.shape[0]): 
    for y in range(two.shape[1]): 
     three[x][y] = two[x][y] 

Drucken der Inhalte von ‚zwei‘ und ‚drei‘ gibt das folgende Ergebnis

print(three) 
array([[ 1., 2., 3.], 
     [ 1., 2., 3.], 
     [ 1., 2., 3.]]) 
print(two) 
array([[1, 2, 3], 
     [1, 2, 3], 
     [1, 2, 3]]) 

Obwohl für dieses kleine Beispiel numpy True zurück, wenn ich Gleichheit mit np.array_equal zu testen, ist es möglich, dass roundi ng-Fehler führen dazu, dass der Test in Ihrem Fall falsch ist.

Eine Abhilfe hierfür könnte der folgende Test sein:

sum(sum(two==three)) == two.shape[0]*three.shape[1] 

Obwohl es wahrscheinlich effizientere Wege sind.

Verwandte Themen