通过索引和掩码进行更新?

我有一个很大的二维数组,可以通过索引访问。我只想更新不为零的索引数组的值。

arrayx = np.random.random((10,10))

假设我有索引(这只是示例,实际索引是由单独的进程生成的):

idxs = np.array([[4],[5],[6],[7],[8]]),np.array([[5,9]])

鉴于这些索引,这应该可以,但不能。

arrayx[idxs]

array([[0.7,0.1 ],[0.79,0.51],[0.,0.8 ],[0.82,0.32],0.89]],dtype=float16)

// note from editor: '<>' is equivalent to '!='
// but I agree that '>' 0 is more correct
// mask = mapx[idxs] <> 0 // original
mask = arrayx[idxs] > 0 // better

array([[ True,True],[ True,[False,True]])

arrayx[idxs][mask] += 1

但是,这不会更新阵列。我该怎么解决?

candy009 回答:通过索引和掩码进行更新?

一个简单的带有np.where且带有掩码作为选择和分配的第一个输入的输入-

- debug:
    msg: User fred's uid is {{ lookup('pipe',"awk -F: '/^fred/{print $3}' /etc/passwd") }}

自定义更新值

可以将第二个参数(此处为mapx[idxs] = np.where(mask,mapx[idxs]+1,mapx[idxs]) )编辑为您可能要对mapx[idxs]+1中与True对应的被屏蔽位置进行的任何复杂更新。因此,假设您使用的是:

mask

然后,将第二个arg替换为mapx[idxs] += x * (A - mapx[idxs])


另一种方法是从mapx[idxs] + x * (A - mapx[idxs])中的True个整数索引中提取整数索引,然后创建基于掩码选择性的新mask,就像这样-

idxs

对于自定义更新,可以类似地编辑最后一步。只需使用r,c = np.nonzero(mask) idxs_new = (idxs[0][:,0][r],idxs[1][0][c]) mapx[idxs_new] += 1 代替idxs_new即可进行更新。

本文链接:https://www.f2er.com/2973022.html

大家都在问