繁体   English   中英

更新多重索引np.array中的元素

[英]Updating elements in multiply indexed np.array

我有一个二维的numpy数组,需要通过多层索引来更新元素的选择。 对我来说,这样做的明显方法不起作用,因为似乎numpy只是更新数组的副本,而不是数组本身:

import numpy as np

# Create an array and indices that should be updated
arr = np.arange(9).reshape(3,3)
idx = np.array([[0,2], [1,1],[2,0]])
bool_idx = np.array([True, True, False])

# This line does not work as intended since the original array stays unchanged
arr[idx[:,0],idx[:,1]][bool_idx] = -1 * arr[idx[:,0],idx[:,1]][bool_idx]

这是结果输出:

>>> arr
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

但是,我期望此输出:

>>> arr
array([[0, 1, -2],
       [3, -4, 5],
       [6, 7, 8]])

我们需要使用给定的mask索引,然后索引到arr并分配新值。 对于索引,我们可以使用tuple(masked_indices)进行索引,或者使用index-array的两列进行整数索引,从而提供两种方法。

方法1:

arr[tuple(idx[bool_idx].T)] *= -1

方法2:

idx_masked = idx[bool_idx]
arr[idx_masked[:,0],idx_masked[:,1]] *= -1

为什么原始方法无效?

在LHS上,您正在做arr[idx[:,0],idx[:,1]][bool_idx] ,这基本上是两个步骤: arr[idx[:,0],idx[:,1]] ,根据arr.__getitem__(indexer)arr.__getitem__(indexer) *。 当indexer是切片时,元素的规则性允许NumPy返回视图(通过修改步幅和偏移量)。 当索引器是任意布尔掩码或任意整数数组时,所选元素通常没有规律性,因此无法返回视图。 让我们将arr[idx[:,0],idx[:,1]]称为arr2

下一步,使用组合的arr[idx[:,0],idx[:,1]][bool_idx] ,即arr2[bool_idx] ,在arr2[bool_idx]将其称为arr2.__setitem__(mask) ,其实现为修改arr2 ,因此不会传播回arr

*灵感来自-https: //stackoverflow.com/a/38768993/

有关__getitem____setitem__更多信息。

为什么此帖子中张贴的方法有效?

因为两者都直接将arrindexer与修改arr arr.__setitem__(indexer)使用。

您只需要对自己的尝试做一些小改动-您就需要在每个整数索引表达式上应用布尔值索引数组。 换句话说,这应该起作用:

arr[idx[:,0][bool_idx],idx[:,1][bool_idx]] *= -1

(我刚刚将[bool_idx]移动到了方括号内,以将其应用于两个整数索引表达式idx[:,0]idx[:,1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM