it-swarm.com.de

Ersetzen Sie mehrere Elemente im numpy-Array durch 1

In einem gegebenen numpy-Array X:

X = array([1,2,3,4,5,6,7,8,9,10])

Ich möchte die Indizes (2, 3) und (7, 8) durch ein einzelnes Element -1 ersetzen, z.

X = array([1,2,-1,5,6,7,-1,10])

Mit anderen Worten, ich habe Werte an den Indizes (2, 3) und (7,8) des ursprünglichen Arrays durch einen einzelnen Wert ersetzt. 

Frage ist: Gibt es einen numpy-ish-Weg (d. H. Ohne für Loops und Verwendung von Python-Listen)? Vielen Dank.

Hinweis: Dies ist NICHT gleichbedeutend mit dem Ersetzen eines einzelnen Elements durch ein anderes. Es geht darum, mehrere Werte durch einen "singulären" Wert zu ersetzen. Vielen Dank.

14
khan

np.put versuchen:

np.put(X, [2,3,7,8], [-1,0]) # `0` can be changed to anything that's not in the array
print(X[X!=0]) # whatever You put as an number in `put`

Verwenden Sie also im Grunde put, um die Werte für die Indizes auszuführen, und löschen Sie dann die Nullwerte.

Oder, wie @khan sagt, etwas tun kann, das außerhalb des Bereichs liegt:

np.put(X, [2,3,7,8], [-1,np.max(X)+1])
print(X[X!=X.max()])

Alle Ausgabe:

[ 1  2 -1  5  6  7 -1 10]
1
U9-Forward

Eine Lösung, die numpy.delete verwendet, ähnlich wie @pault, jedoch effizienter ist, da reine Numpy-Indexierung verwendet wird. Aufgrund dieser effizienten Indizierung können Sie jedoch gezackte Arrays nicht als Indizes übergeben

Konfiguration

a = np.array([1,2,3,4,5,6,7,8,9,10])
idx = np.stack([[2, 3], [7, 8]])

a[idx] = -1
np.delete(a, idx[:, 1:])

array([ 1,  2, -1,  5,  6,  7, -1, 10])
6
user3483203

Ich bin nicht sicher, ob dies in einem Schritt möglich ist, aber hier ist eine Möglichkeit, np.delete zu verwenden:

import numpy as np
from operator import itemgetter

X = np.array(range(1,11))
to_replace = [[2,3], [7,8]]


X[list(map(itemgetter(0), to_replace))] = -1
X = np.delete(X, list(map(lambda x: x[1:], to_replace)))
print(X)
#[ 1  2 -1  5  6  7 -1 10]

Zuerst ersetzen wir das erste Element jedes Paares durch -1. Dann löschen wir die restlichen Elemente.

4
pault