Python 如何使用numpy实现更优雅的循环?

Python 如何使用numpy实现更优雅的循环?,python,python-3.x,numpy,Python,Python 3.x,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 rand

这是我的一些代码片段。有合适的人选吗 这样做的方法。一些花式的小把戏

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]
这就是我将得到的

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]])
我相信有一些奇特的方法可以做到这一点。
有人能帮忙吗?

您可以使用数组为其他数组编制索引:

index = np.arange(len(action))
q_val[index, action] -= to_set[index]

很容易,这可以改写为:

q_val[:,1] -= 1

一行的结果是

q_val[:,action] -= to_set

我投票结束这篇文章,因为它不太可能让未来的读者受益。