2017-10-04 2 views
7

Das klingt einfach, und ich denke, dass ich dies in meinem Kopf zu komplizieren.Wie zwei numply Arrays der gleichen Form konditional zu kombinieren

Ich möchte ein Array erstellen, dessen Elemente aus zwei Source-Arrays der gleichen Form generiert werden, je nachdem, welches Element in den Source-Arrays größer ist.

zu veranschaulichen:

import numpy as np 
array1 = np.array((2,3,0)) 
array2 = np.array((1,5,0)) 

array3 = (insert magic) 
>> array([2, 5, 0)) 

I kann nicht arbeiten, wie eine array3 zu erzeugen, die die Elemente der array1 und array2 kombiniert um ein Array zu produzieren, wo nur die größere der beiden array1/array2 Elementwerte ist, genommen.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank.

Antwort

18

könnten Wir verwenden NumPy Einbau-np.maximum, machte genau zu diesem Zweck -

np.maximum(array1, array2) 

Eine andere Möglichkeit wäre es, die NumPy ufunc np.max auf einem 2D gestapelte Anordnung zu verwenden und max-reduce entlang der ersten Achse (axis=0) -

np.max([array1,array2],axis=0) 

Timings auf 1 Million Datensätze -

In [271]: array1 = np.random.randint(0,9,(1000000)) 

In [272]: array2 = np.random.randint(0,9,(1000000)) 

In [274]: %timeit np.maximum(array1, array2) 
1000 loops, best of 3: 1.25 ms per loop 

In [275]: %timeit np.max([array1, array2],axis=0) 
100 loops, best of 3: 3.31 ms per loop 

# @Eric Duminil's soln1 
In [276]: %timeit np.where(array1 > array2, array1, array2) 
100 loops, best of 3: 5.15 ms per loop 

# @Eric Duminil's soln2 
In [277]: magic = lambda x,y : np.where(x > y , x, y) 

In [278]: %timeit magic(array1, array2) 
100 loops, best of 3: 5.13 ms per loop 
+0

Ahah. Danke für die "Zeit", aber es ist ziemlich klar, dass der Standard, optimierter numpy Weg ist schneller als ein kundenspezifischer. Meine Methode würde nur Sinn machen mit einem komplexeren Zustand. –

+1

@EricDuminil Yup total! Ich versuche nur zu sehen, wie sich verschiedene Methoden aufbauen, für mich und andere auch. – Divakar

12

Wenn Ihr Zustand immer komplexer wird, könnten Sie np.where verwenden:

import numpy as np 
array1 = np.array((2,3,0)) 
array2 = np.array((1,5,0)) 
array3 = np.where(array1 > array2, array1, array2) 
# array([2, 5, 0]) 

Sie array1 > array2 mit jeder Bedingung ersetzen könnte. Wenn alles, was Sie wollen, das Maximum ist, gehen Sie mit @ Divakar answer.

Und nur so zum Spaß:

magic = lambda x,y : np.where(x > y , x, y) 
magic(array1, array2) 
# array([2, 5, 0]) 
Verwandte Themen