如何在Numpy数组中设置单个索引

我正在尝试使用数组来设置其他数组中的值。不幸的是,与其设置值,不如以某种方式覆盖一堆值。发生了什么,我如何实现我想要的?


>>> target = np.array( [ [0,1],[1,2],[2,3] ])

>>> target

array([[0, 1],

       [1, 2],

       [2, 3]])

>>> actions = np.array([0,0,0])

>>> target[actions] #The first row, 3 times

array([[0, 1],

       [0, 1],

       [0, 1]])

>>> target[:,actions] #The first column, 3 times

array([[0, 0, 0],

       [1, 1, 1],

       [2, 2, 2]])

>>> values = np.array([7,8,9])

>>> target[:,actions] = values #why isnt this working?

>>> target

array([[9, 1],

       [9, 2],

       [9, 3]])

#Actually want

#array([[7, 1],

#       [8, 2],

#       [9, 3]])


>>> target = np.array( [ [0,1],[1,2],[2,3] ]) #reset to original value

>>> actions = np.array([0,1,0])

>>> target[:,actions] = values.reshape(3, 1)

array([[7, 7],

       [8, 8],

       [9, 9]])

#Actually want

#array([[7, 1],

#       [1, 8],

#       [9, 3]])


慕姐8265434
浏览 302回答 3
3回答

繁星点点滴滴

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

浮云间

将[7,8,9]写入第一列的2种方法:基本索引(带切片):In [396]: target[:,0] = [7,8,9]           # all rows, 1st columnIn [397]: targetOut[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]: targetOut[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]: targetOut[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]]).TOut[413]: array([[7],       [8],       [9]])In [414]: target[:,[0,0,0]] = _In [415]: targetOut[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]]).TIn [425]: targetOut[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]])

明月笑刀无情

我无法使用:索引来使其工作,但是以下内容通过使用索引数组而起作用。不知道为什么该:方法不起作用,如果有人可以提出一种解决方法,我会接受。>>> 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>>> targetarray([[7, 1],       [1, 8],       [9, 3]])
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python