5 Stimmen

Zuweisung von Werten in einem Numpy-Array

Ich habe ein Numpy-Array mit Nullen. Nehmen wir der Einfachheit halber an, es sei 2x3x4:

x = np.zeros((2,3,4))

und angenommen, ich habe ein 2x3-Array mit zufälligen ganzen Zahlen von 0 bis 3 (der Index der 3. Dimension von x).

>>> y = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
>>> y
[[2 1 0]
 [3 2 0]]

Wie kann ich die folgenden Zuweisungen effizient tun (bearbeiten: etwas, das nicht für Schleifen verwenden und funktioniert für x mit einer beliebigen Anzahl von Dimensionen und eine beliebige Anzahl von Elementen in jeder Dimension)?

>>> x[0,0,y[0,0]]=1
>>> x[0,1,y[0,1]]=1
>>> x[0,2,y[0,2]]=1
>>> x[1,0,y[1,0]]=1
>>> x[1,1,y[1,1]]=1
>>> x[1,2,y[1,2]]=1
>>> x
array([[[ 0.,  0.,  1.,  0.],
        [ 0.,  1.,  0.,  0.],
        [ 1.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  1.],
        [ 0.,  0.,  1.,  0.],
        [ 1.,  0.,  0.,  0.]]])

Danke, James

2voto

illya Punkte 765

Im Moment fällt mir nur die "einfache" Version ein, die eine Abflachung entlang der ersten beiden Dimensionen beinhaltet. Dieser Code sollte funktionieren:

shape_last = x.shape[-1]
x.reshape((-1, shape_last))[np.arange(y.size), y.flatten()] = 1

Daraus ergibt sich (mit meiner zufällig erzeugten y ):

array([[[ 0.,  0.,  0.,  1.],
        [ 0.,  0.,  1.,  0.],
        [ 0.,  1.,  0.,  0.]],

       [[ 0.,  1.,  0.,  0.],
        [ 0.,  0.,  0.,  1.],
        [ 0.,  1.,  0.,  0.]]])

Der Schlüssel ist, wenn Sie eine Indizierung mit mehreren Numpy-Arrays durchführen ( erweiterte Indizierung ), verwendet numpy Paare von Indizes, um in das Array zu indizieren.

Vergewissern Sie sich natürlich x y y entweder der Ordnung C oder der Ordnung F entsprechen - andernfalls würden die Aufrufe an reshape y flatten können unterschiedliche Befehle erteilen.

2voto

Alex I Punkte 18619

用途 numpy.meshgrid (), um Arrays von Indizes zu erstellen, die Sie verwenden können, um sowohl in Ihr ursprüngliches Array als auch in das Array von Werten für die dritte Dimension zu indizieren.

import numpy as np
import scipy as sp
import scipy.stats.distributions

a = np.zeros((2,3,4))
z = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))

xx, yy = np.meshgrid( np.arange(2), np.arange(3) )
a[ xx, yy, z[xx, yy] ] = 1
print a

Der Übersichtlichkeit halber habe ich Ihr Array von x in a und das Array der Indizes von y in z umbenannt.

編集部 4D-Beispiel:

a = np.zeros((2,3,4,5))
z = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
w = sp.stats.distributions.randint.rvs(0, 5, size=(2,3))

xx, yy = np.meshgrid( np.arange(2), np.arange(3) )
a[ xx, yy, z[xx, yy], w[xx, yy] ] = 1

0voto

x = np.zeros((2,3,4))
y=np.array([[2, 1, 0],[3, 2, 0]]) # or y=sp.stats...
for i in range(2):
    for j in range(3):
        x[i,j,y[i,j]]=1

bringt das gewünschte Ergebnis, IIRC. Wenn sich die Array-Dimensionen nie ändern, sollten Sie die beiden for-Schleifen und ihre Last durch

for j in range(3):
    x[0,j,y[0,j]] = x[1,j,y[1,j]] = 1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X