398 Stimmen

Python: wie man erkennt, ob eine Variable ein Array oder ein Skalar ist

Ich habe eine Funktion, die das Argument NBins annimmt. Ich möchte diese Funktion mit einem Skalar 50 oder einem Array [0, 10, 20, 30] aufrufen. Wie kann ich innerhalb der Funktion identifizieren, wie lang NBins ist? Oder anders gesagt, ob es sich um einen Skalar oder einen Vektor handelt?

Ich habe es so versucht:

>>> N=[2,3,5]
>>> P = 5
>>> len(N)
3
>>> len(P)
Traceback (most recent call last):
  File "", line 1, in 
TypeError: object of type 'int' has no len()
>>> 

Wie du siehst, kann ich len nicht auf P anwenden, da es sich nicht um ein Array handelt... Gibt es in Python etwas wie isarray oder isscalar?

Danke

7voto

Marek Punkte 852

Ein weiterer alternativer Ansatz (Verwendung des Klassenattributs name):

N = [2,3,5]
P = 5

type(N).__name__ == 'list'
True

type(P).__name__ == 'int'
True

type(N).__name__ in ('list', 'tuple')
True

Es ist kein Import erforderlich.

4voto

Shital Shah Punkte 54846

Hier ist der beste Ansatz, den ich gefunden habe: Überprüfen Sie das Vorhandensein von __len__ und __getitem__.

Sie könnten fragen, warum? Die Gründe hierfür sind:

  1. Die beliebte Methode isinstance(obj, abc.Sequence) scheitert bei einigen Objekten, einschließlich von PyTorch's Tensor, da sie __contains__ nicht implementieren.
  2. Leider enthält Pythons `collections.abc' nichts, das nur __len__ und __getitem__ überprüft, was ich als minimale Methoden für array-ähnliche Objekte empfinde.
  3. Es funktioniert mit list, tuple, ndarray, Tensor usw.

Also, ohne weitere Umschweife:

def is_array_like(obj, string_is_array=False, tuple_is_array=True):
    result = hasattr(obj, "__len__") and hasattr(obj, '__getitem__') 
    if result and not string_is_array and isinstance(obj, (str, abc.ByteString)):
        result = False
    if result and not tuple_is_array and isinstance(obj, tuple):
        result = False
    return result

Beachten Sie, dass ich Standardparameter hinzugefügt habe, da Sie in den meisten Fällen Zeichenfolgen als Werte und nicht als Arrays betrachten möchten. Das Gleiche gilt für Tupel.

4voto

Puck Punkte 2070

Um die Frage im Titel zu beantworten, eine direkte Möglichkeit zu erkennen, ob eine Variable ein Skalar ist, ist zu versuchen, sie in eine Gleitkommazahl umzuwandeln. Wenn Sie TypeError erhalten, ist es nicht.

N = [1, 2, 3]
try:
    float(N)
except TypeError:
    print('Es handelt sich nicht um einen Skalar')
else:
    print('Es handelt sich um einen Skalar')

3voto

suhailvs Punkte 17111
>>> N=[2,3,5]
>>> P = 5
>>> type(P)==type(0)
True
>>> type([1,2])==type(N)
True
>>> type(P)==type([1,2])
False

2voto

unnati patil Punkte 1571

Du kannst den Datentyp der Variablen überprüfen.

N = [2,3,5]
P = 5
type(P)

Es wird dir den Datentyp von P ausgeben.

So kannst du unterscheiden, ob es sich um eine Ganzzahl oder ein Array handelt.

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