为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕姐8265434 2021-04-09 18:14:27
我正在尝试使用数组来设置其他数组中的值。不幸的是,与其设置值,不如以某种方式覆盖一堆值。发生了什么,我如何实现我想要的?>>> target = np.array( [ [0,1],[1,2],[2,3] ])>>> targetarray([[0, 1],       [1, 2],       [2, 3]])>>> actions = np.array([0,0,0])>>> target[actions] #The first row, 3 timesarray([[0, 1],       [0, 1],       [0, 1]])>>> target[:,actions] #The first column, 3 timesarray([[0, 0, 0],       [1, 1, 1],       [2, 2, 2]])>>> values = np.array([7,8,9])>>> target[:,actions] = values #why isnt this working?>>> targetarray([[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]])
查看完整描述

3 回答

?
繁星点点滴滴

TA贡献1803条经验 获得超3个赞

target[:,actions]选择同一列target三次。

当您说时target[:,actions] = values,您正在做的是:

  1. 将7分配给该列中的所有值,三次。

  2. 将8分配给该列中的所有值,三次。

  3. 将9分配给该列中的所有值,三次。

因此,您在该列中的所有值中最终得到9。

如果您坚持要进行这种笨拙的三重数据写入,则可以通过转置写入来解决此问题:

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

这将写入[7,8,9]该列三次。显然这很浪费,您可以改为执行以下操作:

target[:,actions[-1]] = values

效果应该相同,并且可以节省计算量。


查看完整回答
反对 回复 2021-04-20
?
浮云间

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]])


查看完整回答
反对 回复 2021-04-20
?
明月笑刀无情

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]])


查看完整回答
反对 回复 2021-04-20
  • 3 回答
  • 0 关注
  • 257 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号