2017-06-19 4 views
3

Zum Beispiel:Rounding Elemente in numpy Array auf die Anzahl der dem gleichen Index in einem anderen Array

a=[[ 2.22323422 3.34342 ] 
    [ 24.324  97.56464 ]] 

round_to= [[2 1] 
      [1 3]] 

Meine erwartete Ausgabe wäre:

a_rounded= [[ 2.2 3. ] 
      [ 2. 97.6]] 

Ich möchte, dies zu tun, ohne das Schneiden aus jedes Element und tun es individuell.

+2

Es scheint nicht logisch, 24.324 zu 2 zu runden. – Psidom

+0

Ich habe gerade ein Beispiel aus meinem Ärmel gezogen, weshalb ich das nicht bemerkt habe. –

Antwort

0

drei Optionen:

  1. Etwas ähnliches Verständnis zur Liste .item NumPy der Verwendung.
  2. itertools.starmap
  3. np.broadcast

Timing ist unten. Option 3 scheint bei weitem die schnellste Route zu sein.

from itertools import starmap 

np.random.seed(123) 
target = np.random.randn(2, 2) 
roundto = np.arange(1, 5, dtype=np.int16).reshape((2, 2)) # must be type int 

def method1(): 
    return (np.array([round(target.item(i), roundto.item(j)) 
        for i, j in zip(range(target.size), 
            range(roundto.size))]) 
            .reshape(target.shape)) 

def method2(): 
    return np.array(list(starmap(round, zip(target.flatten(), 
           roundto.flatten())))).reshape(target.shape) 

def method3(): 
    b = np.broadcast(target, roundto) 
    out = np.empty(b.shape) 
    out.flat = [round(u,v) for (u,v) in b] 
    return out 

from timeit import timeit 

timeit(method1, number=100) 
Out[50]: 0.003252145578553467 

timeit(method2, number=100) 
Out[51]: 0.002063405777064986 

timeit(method3, number=100) 
Out[52]: 0.0009481473990007316 

print('method 3 is %0.2f x faster than method 2' % 
     (timeit(method2, number=100)/timeit(method3, number=100))) 
method 3 is 2.91 x faster than method 2 
+0

Ich wollte auch eine for-Schleife vermeiden, aber danke für Ihre Antwort. In diesem Fall scheint es keine Alternative zu geben. –

+0

Ja, natürlich. Ich bin gerade auf diese Seite gekommen. –

Verwandte Themen