2017-12-22 4 views

Antwort

2

Hier ist ein Ansatz

In [2]: a[:, -1] = a[:, -1] > 0 

In [3]: a 
Out[3]: 
array([[ 0.15293227, -1.50167614, 0.  ], 
     [ 1.25396778, 0.21520081, 1.  ], 
     [-1.1272423 , 1.18971277, 1.  ]]) 

und wenn Sie für die negativen Einträge wollen nicht auf Null gesetzt werden, hier ist eine facetious Alternative:

In [4]: a[:, -1] = a[:, -1] ** (a[:, -1] < 0) 

In [5]: a 
Out[5]: 
array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 1.  ], 
     [-1.1272423 , 1.18971277, 1.  ]]) 

Als Antwort auf Ihren Kommentar Nehmen wir an, Sie möchten einen benutzerdefinierten Gleitkommawert festlegen, der nur bei den positiven Einträgen eingefügt wird (während die negativen Einträge allein gelassen werden).

In [6]: float_to_insert_at_positives = 3.14159 

In [7]: (float_to_insert_at_positives - a[:, -1]) * (a[:, -1] > 0) + a[:, -1] 

Out[7]: array([-1.04974543, 3.14159 , 3.14159 ]) 

In [8]: a[:, -1] = (float_to_insert_at_positives - a[:, -1]) * (a[:, -1] > 0) + 
... a[:, -1] 

In [9]: a 
Out[9]: 
array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 3.14159 ], 
     [-1.1272423 , 1.18971277, 3.14159 ]]) 
+0

Cool danke! Was macht der Operator '**'? – user14492

+0

Wenn das linke Argument des Operators '**' ein NumPy 'ndarray' ist, dann bedeutet' ** ', jedes Element des Arrays auf der linken Seite auf die vom entsprechenden Element des Arrays auf der rechten Seite angegebene Potenz anzuheben (oder, erhöhe alles auf die gleiche Potenz, wenn nur ein skalarer Exponentenwert angegeben wird). In regulären Python bedeutet '**' Potenzierung für numerische Typen. '2 ** 3' ist zwei gewürfelt. – ely

+0

Ahh ich sehe. Ihre zweite Methode würde also nur funktionieren, wenn sie auf 1 gesetzt werden sollen, weil 'x ** 0 == 1 '. Gibt es eine Möglichkeit, sie auf einen anderen Float zu setzen? – user14492

1

Sind Sie auf der Suche nach so etwas?

import numpy as np 
list_1=np.array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 0.39136217], 
     [-1.1272423 , 1.18971277, 0.19569736]]) 

for i in list_1: 
    if i[-1:][0]>0: 
     i[i.tolist().index(i[-1:])]=1 

print(list_1) 

Ausgang:

[[ 0.15293227 -1.50167614 -1.04974543] 
[ 1.25396778 0.21520081 1.  ] 
[-1.1272423 1.18971277 1.  ]] 

Just for fun in einer Zeile, die Sie so etwas tun kann:

[i.__setitem__(i.tolist().index(i[-1:]),1) for i in list_1 if i[-1:][0]>0] 

Ausgang:

[[ 0.15293227 -1.50167614 -1.04974543] 
[ 1.25396778 0.21520081 1.  ] 
[-1.1272423 1.18971277 1.  ]] 
+1

Whoah Mann.Listenverständnis soll den Kern lesbarer und verständlicher machen ... das ist nicht. Wenn man dort hinblickt, verbessert sich nicht immer alles. Trotzdem danke! Ich mag die erste Lösung. – user14492

3

Aktuelle Antworten sehen zu kompliziert aus. Dies kann durch die Kombination von boolescher und "normaler" Indexierung wesentlich vereinfacht werden.

In [1]: import numpy as np 

In [2]: a = np.array([[ 0.15293227, -1.50167614, -1.04974543], 
    ...:    [ 1.25396778, 0.21520081, 0.39136217], 
    ...:    [-1.1272423 , 1.18971277, 0.19569736]]) 

Boolean Array mit Ihrem Zustand für die letzte Spalte:

In [3]: mask = a[:, -1] > 0. 
    ...: mask 
Out[3]: array([False, True, True], dtype=bool) 

nun mit Kombination von boolean-Array mit dem Schneiden Sie den gewünschten Wert zuweisen:

In [4]: a[mask, -1] = 1 
    ...: a 
    ...: 
Out[4]: 
array([[ 0.15293227, -1.50167614, -1.04974543], 
     [ 1.25396778, 0.21520081, 1.  ], 
     [-1.1272423 , 1.18971277, 1.  ]]) 

Mehr auf Indizierung mit Numpy kann here gefunden werden.

Verwandte Themen