2016-03-31 4 views
1

Ich bin mir nicht wirklich bewusst, welche Regeln numpy bei einigen 2D-Array-Operationen in Bezug auf die Rückgabe des Ergebnisses als 1d oder 2d-Array folgt. Lassen Sie uns das folgende Stück Codenumpy gibt 1d Array und 2d Array für den gleichen Code zurück

idx_cls_samples = sample_data[:, -1] == c 
v_feature = sample_data[idx_cls_samples, f] 

f_values = sample_data[[sample_data[:, -1] == c], f] 

Hinweis beachten Sie, dass die letzte Zeile einfach die ersten beiden Zeilen zu einem zusammengefasst ist.

Das Ergebnis der ersten beiden Zeilen ist ein numpy Vektor des Formulararrays ([1, 2, 3, ...]) und das Ergebnis der letzten Zeile ist Array ([[1, 2, 3, .. .]]) und ich glaube, das Ergebnis sollte Array ([1], [2], [3], ...)) in beiden Fällen sein. Wie kann ich vorher herausfinden, welches Format wird numpy wählen, um das Ergebnis zurückzugeben?

+0

Die letzte Zeile ist nicht ganz die gleiche, 'sample_data [sample_data [:, -1] == c, f]' wäre das gleiche (legte einen zusätzlichen Satz von Klammern) –

+0

Danke, dass Sie darauf hingewiesen haben. – user3575732

Antwort

2

Beachten Sie, dass die letzte Zeile einfach die ersten beiden Zeilen zu einer Zeile zusammengefasst ist.

Nein, ist es nicht. Sie stecken ein zusätzliches Paar von Klammern drin:

f_values = sample_data[[sample_data[:, -1] == c], f] 
#     ^     ^

Nehmen Sie sie heraus.

Wie für die Indexierungsregeln sind diese in der documentation. Sie sind ziemlich lang.

+0

Danke. Mein Fehler. – user3575732

0

sample_data ist 2d. sample_data[:,-1] ist 1d, die letzte Spalte. Die Indizierung mit einem Skalar entfernt eine Dimension.

Die ...=c erzeugt einen Boolean der gleichen Dimension (1d).

sample_data[:, f] ist auch eine 1d, die fth Spalte.

Indexing, dass mit einer Booleschen Array ein Ergebnis der gleichen Dimension der Booleschen Wert zurück, sondern nur eine Teilmenge der Werte

sample_data[idx, f] ist 1d, 2d sample_data[[idx], f] ist (aufgrund der zusätzlichen []).

Sie wollten wahrscheinlich, sample_data[(sample_data[:, -1] == c), f], wo () gruppiert nur die Zeichenfolgen, manchmal für den Operator Vorrang, manchmal nur um besser lesbar zu machen. (aber hüte dich vor (...,), die ein Tupel macht).

sample_data[idx, [f]] hätte Ihnen die Spalte 'vector', 2d mit 1 Spalte gegeben.

Eine andere Art zu sehen sample_data[idx,f] ist: idx wählt eine Teilmenge von Zeilen, f wählt eine Spalte aus diesem 2d.

Oft kann 2D-Indexierung (oder höher nd) indexweise untersucht werden; das trifft besonders zu, wenn ein Index ein Skalar oder eine Scheibe ist. Es ist komplizierter, wenn ein Index eine Liste oder ein Array ist, oder schlimmer noch, zwei oder mehr davon.