2016-11-17 14 views
-1

In Numpy scheint es, dass die Matrix einfach eine verschachtelte Liste von allem sein kann, was nicht auf Zahlen beschränkt ist. Zum BeispielUnregelmäßige Numpy-Matrix

import numpy as np 

a = [[1,2,5],[3,'r']] 
b = np.matrix(a) 

erzeugt keine Beschwerden.

Was ist der Zweck dieser Toleranz, wenn die Liste das Objekt behandeln kann, das keine Matrix im streng mathematischen Sinne ist?

+0

Hey, bitte einen Grund für den Downvote angeben. – Hans

+0

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

+0

@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

Antwort

1

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) 
+0

Schön. Habe das nie gesehen '' __array_interface__'''. Auch eine gute und klare Erklärung. – sascha

Verwandte Themen