3 回答

TA贡献1803条经验 获得超3个赞
target[:,actions]
选择同一列target
三次。
当您说时target[:,actions] = values
,您正在做的是:
将7分配给该列中的所有值,三次。
将8分配给该列中的所有值,三次。
将9分配给该列中的所有值,三次。
因此,您在该列中的所有值中最终得到9。
如果您坚持要进行这种笨拙的三重数据写入,则可以通过转置写入来解决此问题:
target[:,actions] = values.reshape(3, 1)
这将写入[7,8,9]
该列三次。显然这很浪费,您可以改为执行以下操作:
target[:,actions[-1]] = values
效果应该相同,并且可以节省计算量。

TA贡献1829条经验 获得超4个赞
将[7,8,9]写入第一列的2种方法:
基本索引(带切片):
In [396]: target[:,0] = [7,8,9] # all rows, 1st column
In [397]: target
Out[397]:
array([[7, 1],
[8, 2],
[9, 3]])
高级索引(带有2个列表)
In [398]: target[[0,1,2],[0,0,0]] = [7,8,9] # pair [0,0],[1,0],[2,0]
In [399]: target
Out[399]:
array([[7, 1],
[8, 2],
[9, 3]])
第二种方法也适用于混合列:
In [400]: target = np.array( [ [0,1],[1,2],[2,3] ])
In [401]: target[[0,1,2],[0,1,0]] = [7,8,9]
In [402]: target
Out[402]:
array([[7, 1],
[1, 8],
[9, 3]])
广播发挥作用。在这种情况下,有3个可能要广播的数组-2维和源数组。
像这样的高级索引将生成一维数组。因此,源数组必须匹配:
In [403]: target[[0,1,2],[0,1,0]]
Out[403]: array([7, 8, 9])
(1,3)可以广播到(3,),但是(3,1)不能:
In [404]: target[[0,1,2],[0,1,0]] = np.array([[7,8,9]])
In [405]: target[[0,1,2],[0,1,0]] = np.array([[7,8,9]]).T
...
ValueError: shape mismatch: value array of shape (3,1) could not be broadcast to indexing result of shape (3,)
这种索引是不寻常的。请注意,结果为(3,3)。
In [412]: target[:,[0,0,0]]
Out[412]:
array([[0, 0, 0],
[1, 1, 1],
[2, 2, 2]])
(3,1)来源:
In [413]: np.array([[7,8,9]]).T
Out[413]:
array([[7],
[8],
[9]])
In [414]: target[:,[0,0,0]] = _
In [415]: target
Out[415]:
array([[7, 1],
[8, 2],
[9, 3]])
(3,1)可以广播到(3,3)。它可以工作,但最终将[7,8,9]分配了3次,全部分配给相同的0列。
分配第一列的另一种方法:
In [423]: target[np.ix_([0,1,2],[0,0,0])]
Out[423]:
array([[0, 0, 0],
[1, 1, 1],
[2, 2, 2]])
同样,(3,3)与接受(3,1):
In [424]: target[np.ix_([0,1,2],[0,0,0])] = np.array([[7,8,9]]).T
In [425]: target
Out[425]:
array([[7, 1],
[8, 2],
[9, 3]])
ix_ 制作2个可以互相广播的数组,在这种情况下为列向量和第1行:
In [426]: np.ix_([0,1,2],[0,0,0])
Out[426]:
(array([[0],
[1],
[2]]), array([[0, 0, 0]]))
我可以选择targetwith的所有元素:
In [430]: target[np.ix_([0,1,2],[0,1])]
Out[430]:
array([[0, 1],
[1, 2],
[2, 3]])
并按照混乱的顺序排列:
In [431]: target[np.ix_([2,0,1],[1,0])]
Out[431]:
array([[3, 2],
[1, 0],
[2, 1]])

TA贡献1828条经验 获得超4个赞
我无法使用:索引来使其工作,但是以下内容通过使用索引数组而起作用。不知道为什么该:方法不起作用,如果有人可以提出一种解决方法,我会接受。
>>> target = np.array( [ [0,1],[1,2],[2,3] ])
>>> rows = np.arange(target.shape[0])
>>> actions = np.array([0,1,0])
>>> values = np.array([7,8,9])
>>> target[rows,actions] = values
>>> target
array([[7, 1],
[1, 8],
[9, 3]])
添加回答
举报