Ist eine Möglichkeit, dies zu tun

x = np.zeros(10)
x.itemset(7,1)

In einer Zeile wie dieser

y = np.zeros(10).itemset(7,1)

?

Aktueller Output

print(x)
[0. 0. 0. 0. 0. 0. 0. 1. 0. 0.]

print(y)
None
0
Kroliczjo 21 Feb. 2020 im 22:18

5 Antworten

Beste Antwort

Sie können np.bincount für zusätzliche Flexibilität verwenden:

np.bincount([7],[1],10)
# array([0., 0., 0., 0., 0., 0., 0., 1., 0., 0.])

Sie können beispielsweise mehrere Werte festlegen:

np.bincount([1,4,7],[2.1,5,-1],8)
array([ 0. ,  2.1,  0. ,  0. ,  5. ,  0. ,  0. , -1. ])
1
Paul Panzer 21 Feb. 2020 im 19:43

Sie können np.where verwenden, um eine Bedingung zu testen (z. B. testen Sie, ob sich der Indexspeicherort in einer Gruppe befindet, über np.isin), und stellen Sie den Wert entsprechend ein.

idx_locations = (5, 7)
>>> np.where(np.isin(np.arange(10), idx_locations), 1, 0)
array([0, 0, 0, 0, 0, 1, 0, 1, 0, 0])
0
Alexander 21 Feb. 2020 im 20:16

Nun, nicht direkt nein, da itemset() eine nicht zurückkehrende Funktion ist (deshalb ist y None). Ist es wirklich so schlimm, zwei Zeilen zu haben? Sie könnten es tun, ohne Numpy und Listenverständnis zu verwenden:

 y = [1.0 if i == 7 else 0.0 for i in range(10)]

Wie gesagt, ich würde einfach mit der zusätzlichen Zeile gehen, da dies unnötig komplex ist.

2
Eric 21 Feb. 2020 im 19:24

Die x.itemset(7,1) führen diese Operation an Ort und Stelle aus. Dies bedeutet, dass x geändert wird, jedoch None zurückgegeben wird.

Aus diesem Grund können Sie y = np.zeros(10).itemset(7,1) nicht verwenden ...

1
theletz 21 Feb. 2020 im 19:23

Stimme Erics Antwort voll und ganz zu. Wenn Sie jedoch auf einer Zeile bestehen, da itemset an Ort und Stelle funktioniert und mehrere Instanzen derselben veränderlichen Variable (z. B. Numpy-Array) in einer Liste festgelegt sind, verweisen alle Instanzen auf dasselbe Array. Wir können Folgendes tun:

y = [x.itemset(7, 1) if i == 0 else x for i, x in enumerate([np.zeros(10)]*2)][1]
print(y)

Beim ersten Durchlauf (i == 0) wird das Element des Arrays festgelegt (und None zurückgegeben), und beim zweiten Durchlauf (i == 1) wird nur das Array zurückgegeben.

0
user2999345 21 Feb. 2020 im 19:38