Come dice il titolo, supponiamo di voler scrivere una funzione di segno (dimentichiamo il segno (0) per ora), ovviamente ci aspettiamo di firmare (2) = 1 e sign (array ([- 2, -2,2])) = array ([- 1, -1,1]). Tuttavia, la seguente funzione non funzionerà perché non può gestire gli array numpy.Una funzione python che accetta come argomento un array scalare o numpy
def sign(x):
if x>0: return 1
else: return -1
La funzione successiva non funziona poiché x non ha un membro di forma se è solo un numero. Anche se viene usato qualche trucco come y = x * 0 + 1, y non avrà un metodo [].
def sign(x):
y = ones(x.shape)
y[x<0] = -1
return y
Anche con l'idea da un'altra domanda (how can I make a numpy function that accepts a numpy array, an iterable, or a scalar?), la funzione successiva non funziona quando x è un numero unico perché in questo caso x.shape e y.shape sono solo() e indicizzazione y è illegale.
def sign(x):
x = asarray(x)
y = ones(x.shape)
y[x<0] = -1
return y
L'unica soluzione sembra essere quella prima di decidere se x è un array o un numero, ma voglio sapere se c'è qualcosa di meglio. Scrivere codice branchy sarebbe scomodo se hai molte piccole funzioni come questa.
indicizzazione 'y' con una maschera * è * legale: il problema qui è che' x <0 'è di nuovo uno scalare piuttosto che un array di 0-d. Se provi 'y [asarray (x <0)]' dovrebbe funzionare. –
Hai preso in considerazione la possibilità di utilizzare il 'np.sign' incorporato? – Jaime
@MarkDickinson Questo è buono, ma dà errori quando x è un numero singolo perché ora y deve essere un singolo numero - quindi y non può essere indicizzato ... – Taozi