400 Stimmen

NumPy-Array-Initialisierung (Füllen mit identischen Werten)

Ich muss ein NumPy-Array der Länge erstellen n , wobei jedes Element davon v .

Gibt es etwas Besseres als:

a = empty(n)
for i in range(n):
    a[i] = v

Ich weiß zeros y ones würde für v = 0, 1 funktionieren. Ich könnte v * ones(n) aber es wird nicht funktionieren, wenn v es None und auch wäre viel langsamer.

559voto

Eric O Lebigot Punkte 85676

NumPy 1.8 eingeführt np.full() was eine direktere Methode ist als empty() gefolgt von fill() um ein Array zu erstellen, das mit einem bestimmten Wert gefüllt ist:

>>> np.full((3, 5), 7)
array([[ 7.,  7.,  7.,  7.,  7.],
       [ 7.,  7.,  7.,  7.,  7.],
       [ 7.,  7.,  7.,  7.,  7.]])

>>> np.full((3, 5), 7, dtype=int)
array([[7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7],
       [7, 7, 7, 7, 7]])

Dies ist wohl die Art und Weise, ein mit bestimmten Werten gefülltes Array zu erstellen, da es explizit beschreibt, was erreicht werden soll (und es kann im Prinzip sehr effizient sein, da es eine sehr spezifische Aufgabe erfüllt).

119voto

Yariv Punkte 12243

Aktualisiert für Numpy 1.7.0: (Hut-Tipp an @Rolf Bartstra.)

a=np.empty(n); a.fill(5) ist am schnellsten.

In absteigender Reihenfolge der Geschwindigkeit:

%timeit a=np.empty(10000); a.fill(5)
100000 loops, best of 3: 5.85 us per loop

%timeit a=np.empty(10000); a[:]=5 
100000 loops, best of 3: 7.15 us per loop

%timeit a=np.ones(10000)*5
10000 loops, best of 3: 22.9 us per loop

%timeit a=np.repeat(5,(10000))
10000 loops, best of 3: 81.7 us per loop

%timeit a=np.tile(5,[10000])
10000 loops, best of 3: 82.9 us per loop

77voto

Paul Punkte 39492

Ich glaube fill ist der schnellste Weg, dies zu tun.

a = np.empty(10)
a.fill(7)

Sie sollten auch immer vermeiden, zu iterieren, wie Sie es in Ihrem Beispiel tun. Eine einfache a[:] = v wird das erreichen, was Ihre Iteration mit Numpy tut Übertragung .

53voto

Nico Schlömer Punkte 45358

Ich hatte np.array(n * [value]) im Sinn, aber offenbar ist das langsamer als alle anderen Vorschläge für ausreichend große n . Die beste in Bezug auf Lesbarkeit und Geschwindigkeit ist

np.full(n, 3.14)

Hier der vollständige Vergleich mit Perfplot (ein Lieblingsprojekt von mir).

enter image description here

Die beiden empty Alternativen sind immer noch die schnellsten (mit NumPy 1.12.1). full holt bei großen Arrays auf.


Code zur Erstellung des Plots:

import numpy as np
import perfplot

def empty_fill(n):
    a = np.empty(n)
    a.fill(3.14)
    return a

def empty_colon(n):
    a = np.empty(n)
    a[:] = 3.14
    return a

def ones_times(n):
    return 3.14 * np.ones(n)

def repeat(n):
    return np.repeat(3.14, (n))

def tile(n):
    return np.repeat(3.14, [n])

def full(n):
    return np.full((n), 3.14)

def list_to_array(n):
    return np.array(n * [3.14])

perfplot.show(
    setup=lambda n: n,
    kernels=[empty_fill, empty_colon, ones_times, repeat, tile, full, list_to_array],
    n_range=[2 ** k for k in range(27)],
    xlabel="len(a)",
    logx=True,
    logy=True,
)

20voto

Rolf Bartstra Punkte 1473

Offenbar sind nicht nur die absoluten Geschwindigkeiten, sondern auch die Geschwindigkeit Bestellung (wie von Benutzer1579844 berichtet) sind geräteabhängig; hier ist, was ich gefunden habe:

a=np.empty(1e4); a.fill(5) ist am schnellsten;

In absteigender Reihenfolge der Geschwindigkeit:

timeit a=np.empty(1e4); a.fill(5) 
# 100000 loops, best of 3: 10.2 us per loop
timeit a=np.empty(1e4); a[:]=5
# 100000 loops, best of 3: 16.9 us per loop
timeit a=np.ones(1e4)*5
# 100000 loops, best of 3: 32.2 us per loop
timeit a=np.tile(5,[1e4])
# 10000 loops, best of 3: 90.9 us per loop
timeit a=np.repeat(5,(1e4))
# 10000 loops, best of 3: 98.3 us per loop
timeit a=np.array([5]*int(1e4))
# 1000 loops, best of 3: 1.69 ms per loop (slowest BY FAR!)

Versuchen Sie also herauszufinden, was auf Ihrer Plattform am schnellsten ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X