2016-04-12 2 views
0

Ich habe eine 3465 x 50157 NumPy Matrix und versuche, eine bestimmte Berechnung mit jedem eindeutigen Wert in einer gewählten Spalte der Matrix als Schwellenwert zu testen. Betrachten Sie das folgende Beispiel:NumPy unique() Rückgabe Array anstelle von Skalar

feat_num = 4 
thresholds = np.unique(X[:, feat_num]) 

for thresh in thresholds: 
    y_left = np.array([ 
     y[i] for i in range(X.shape[0]) if X[i, feat_num] < thresh 
    ]) 

Wenn dies ausgeführt wird, numpy mir folgende Fehler geben:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all(). 

Ich habe bestätigt, dass X[i, feat_num] ein Skalar ist, so gibt es kein Problem. Aus irgendeinem Grund bewertet thresh jedoch eine Art von Array. Ich sehe nicht, wie das sein könnte, da X nur eine große Matrix von ganzen Zahlen ist.

Wer sieht was los ist?

+0

was ist y? oder was ist X nur eine Array-Form ist in Ihrer Frage beschrieben –

+0

Und Thresh ist auch ein Skalar? – hpaulj

Antwort

0

Das Problem ist wahrscheinlich, dass Sie eine numpy matrix eher als eine numpy ndarray verwenden. Die letzteren sind allgemeinere Bestien, und ich würde vorschlagen, dass Sie diese verwenden. Einer der Vorteile des Typs matrix ist, dass algebraische Operationen so funktionieren, wie Sie es von Matrizen erwarten, aber dies ist selten das, was man benötigt, und selbst in diesen Fällen kann numpy.dot verwendet werden, um es mit ndarray Objekten zu arbeiten.

So ist das Problem, dass eine Spalte slice Ihre matrix ein Spaltenvektor ist, das heißt ein matrix Form (N,1) (die eine Liste von Listen entsprechen). Wenn Ihr Original-Array ein ndarray war, dann würde die Säule Scheibe Form hat (N,), dh es ist eine wäre 1d ndarray (kompatibel mit flachen Listen), anstatt ein tatsächlicher Spaltenvektor:

>>> import numpy as np 
>>> X = np.random.rand(3,3) 
>>> Xmat = np.asmatrix(X) 
>>> 
>>> print(X[:,1]) 
[ 0.28797057 0.56186287 0.58674852] 
>>> print(Xmat[:,1]) 
[[ 0.28797057] 
[ 0.56186287] 
[ 0.58674852]] 

Looping über den Spaltenvektor wird Geben Sie eher Listen als Skalare, entgegen Ihren Erwartungen.

Wenn Sie Matrixoperationen nirgendwo verwenden, dann empfehle ich dringend, zu np.array Objekten zu wechseln, die auch Ihr aktuelles Problem lösen sollten.