Как реализовать это для l oop более элегантно с numpy? - PullRequest
0 голосов
/ 16 марта 2020

это фрагмент моего кода. Может кто-нибудь подходящим способом сделать это. Какой-то фантастический NumPy трюк?

q_val = np.random.rand(5,3) 

action = np.ones((5,1),int)
to_set = np.ones((5,1),int)
for x in range(5):
     q_val[x][action[x]] -= to_set[x]

Вот как я создаю значения

q_val = np.random.rand(5,3) //lets say the middel of randome
q_val = array([[0.93373647, 0.        , 0.14962181],//get only zeroes
       [0.67909199, 0.        , 0.07462584],
       [0.05696713, 0.        , 0.03221326],
       [0.78209394, 0.        , 0.58312439],
       [0.09217555, 0.        , 0.17876316]])                           
action = np.ones((5,1),int)
action = >>> action
array([[1],
       [1],
       [1],
       [1],
       [1]])

to_set = np.ones((5,1),int)
to_set = array([[1],
       [1],
       [1],
       [1],
       [1]])

Это то, что я изменю

for x in range(5):
     q_val[x][action[x]] -= to_set[x]

Это то, что я буду get

array([[ 0.93373647, -1.        ,  0.14962181],
       [ 0.67909199, -1.        ,  0.07462584],
       [ 0.05696713, -1.        ,  0.03221326],
       [ 0.78209394, -1.        ,  0.58312439],
       [ 0.09217555, -1.        ,  0.17876316]])

Я уверен, что есть какой-то причудливый способ сделать это в одной из строк. Может кто-нибудь помочь?

Ответы [ 3 ]

1 голос
/ 16 марта 2020

Легко, это можно переписать как:

q_val[:,1] -= 1
1 голос
/ 16 марта 2020

Вы можете просто использовать массивы для индексации в другие массивы:

index = np.arange(len(action))
q_val[index, action] -= to_set[index]
0 голосов
/ 17 марта 2020

Однострочный результат был

q_val[:,action] -= to_set
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...