Frage TypeError: Nur length-1-Arrays können in Python-Skalare konvertiert werden, während plot showing


Ich habe solchen Python-Code:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.int(x)

x = np.arange(1, 15.1, 0.1)
plt.plot(x, f(x))
plt.show()

Und solcher Fehler:

TypeError: only length-1 arrays can be converted to Python scalars

Wie kann ich es reparieren?


11
2018-04-17 18:21


Ursprung


Antworten:


Der Fehler "Nur Länge-1-Arrays können in Python-Skalare konvertiert werden" wird ausgelöst, wenn die Funktion einen einzelnen Wert erwartet, Sie aber stattdessen ein Array übergeben.

Wenn Sie sich die Signatur von np.intSie werden sehen, dass ein einzelner Wert und kein Array akzeptiert wird. Im Allgemeinen, wenn Sie eine Funktion anwenden möchten, die ein einzelnes Element für jedes Element in einem Array akzeptiert, können Sie verwenden np.vectorize:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    return np.int(x)
f2 = np.vectorize(f)
x = np.arange(1, 15.1, 0.1)
plt.plot(x, f2(x))
plt.show()

Sie können die Definition von f (x) überspringen und np.int einfach an die Vektorisierungsfunktion übergeben: f2 = np.vectorize(np.int).

Beachten Sie, dass np.vectorize ist nur eine Komfortfunktion und im Grunde eine for-Schleife. Das wird bei großen Arrays ineffizient sein. Wann immer Sie die Möglichkeit haben, verwenden Sie wirklich vektorisierte Funktionen oder Methoden (wie astype(int) wie @FFT schlägt vor).


13
2018-04-17 18:32



Benutzen:

x.astype(int)

Hier ist das Referenz.


5
2018-02-20 17:26



Beachten Sie, wofür gedruckt wird x. Sie versuchen, ein Array (im Grunde nur eine Liste) in ein int zu konvertieren. length-1 wäre ein Array aus einer einzigen Zahl, von der ich annehme, dass numpy sie nur als Float behandelt. Sie könnten dies tun, aber es ist keine rein numpige Lösung.

EDIT: Ich war vor ein paar Wochen in einem Post involviert, wo eine Operation langsamer war, als ich erwartet hatte, und ich merkte, dass ich in eine Standard-Denkweise verfallen war, dass Numpy immer der Weg zur Geschwindigkeit war. Da meine Antwort nicht so sauber war wie die von Ayhan, dachte ich, ich würde diesen Raum nutzen, um zu zeigen, dass dies ein weiterer solcher Fall ist, um das zu veranschaulichen vectorize ist ungefähr 10% langsamer als das Erstellen einer Liste in Python. Ich weiß nicht genug darüber, warum es so ist, aber vielleicht jemand anderes?

import numpy as np
import matplotlib.pyplot as plt
import datetime

time_start = datetime.datetime.now()

# My original answer
def f(x):
    rebuilt_to_plot = []
    for num in x:
        rebuilt_to_plot.append(np.int(num))
    return rebuilt_to_plot

for t in range(10000):
    x = np.arange(1, 15.1, 0.1)
    plt.plot(x, f(x))

time_end = datetime.datetime.now()

# Answer by ayhan
def f_1(x):
    return np.int(x)

for t in range(10000):
    f2 = np.vectorize(f_1)
    x = np.arange(1, 15.1, 0.1)
    plt.plot(x, f2(x))

time_end_2 = datetime.datetime.now()

print time_end - time_start
print time_end_2 - time_end

1
2018-04-17 18:30