Was Sie erstellt haben, ist ein Objekt dtype Array:
In [302]: b=np.array([[1,2,5],[3,'r']])
In [303]: b
Out[303]: array([[1, 2, 5], [3, 'r']], dtype=object)
In [304]: b.shape
Out[304]: (2,)
In [305]: b[0]
Out[305]: [1, 2, 5]
In [306]: b[1]=None
In [307]: b
Out[307]: array([[1, 2, 5], None], dtype=object)
Die Elemente dieses Arrays sind Zeiger - Zeiger auf Objekte sonst im Speicher, wo. Es hat einen Datenpuffer genau wie andere Arrays. In diesem Fall sind zwei Zeiger, 2
In [308]: b.__array_interface__
Out[308]:
{'data': (169809984, False),
'descr': [('', '|O')],
'shape': (2,),
'strides': None,
'typestr': '|O',
'version': 3}
In [309]: b.nbytes
Out[309]: 8
In [310]: b.itemsize
Out[310]: 4
Es ist sehr ähnlich wie eine Liste - die auch speichert Zeiger in einem Puffer-Objekt. Aber es unterscheidet sich darin, dass es keine append
Methode hat, aber hat alle Array-Einsen wie .reshape
.
Und für viele Operationen behandelt numpy
solch ein Array wie eine Liste - über die Zeiger iterieren usw. Viele der mathematischen Operationen, die mit numerischen Werten arbeiten, scheitern bei Objekt-Dtypen.
Warum dies zulassen? Teilweise ist es nur eine Verallgemeinerung, die das Konzept der Elementwerte/dtypes über die einfachen numerischen und String-Elemente hinaus erweitert. numpy
ermöglicht auch zusammengesetzte dtypes (strukturierte Arrays). MATLAB erweiterte seine Matrixklasse um cells
, die ähnlich sind.
Ich sehe viele Fragen über SO über Objekt-Arrays. Manchmal werden sie fehlerhaft erzeugt, Creating numpy array from list gives wrong shape.
Manchmal werden sie absichtlich erstellt. pandas
ändert leicht eine Datenreihe in Objekt dtype, um eine Mischung von Werten (string, nan, int) aufzunehmen.
np.array()
versucht, so hoch wie möglich ein Dimensionsarray zu erstellen, und greift nur dann auf das Objekt dtype zu, wenn es nicht möglich ist, z. B. wenn sich die Unterlisten unterscheiden. In der Tat müssen Sie auf spezielle Konstruktionsmethoden zurückgreifen, um ein Objektarray zu erstellen, wenn die Unterlisten alle gleich sind. Diese
ist immer noch ein Objektarray, aber die Dimension ist höher:
In [316]: np.array([[1,2,5],[3,'r',None]])
Out[316]:
array([[1, 2, 5],
[3, 'r', None]], dtype=object)
In [317]: _.shape
Out[317]: (2, 3)
Hey, bitte einen Grund für den Downvote angeben. – Hans
Es ist, weil Sie manchmal allgemeine Objekte (wie Strings oder noch mehr General-Stuff) speichern möchten. Es wird nicht nur für mathematische Matrixoperationen verwendet. – sascha
@sascha: Meine Frage ist genau, dass diese Situationen bereits von List im generischen Python behandelt werden können. Warum brauchen wir eine andere Behandlung in Numpy? Ich kann den Zweck sehen, wenn, sagen wir, die Matrixoperation auf eine Matrix von Funktionen erweitert wird. Aber ich glaube nicht, dass Numpy solche Funktionen behandelt. – Hans