如何根据索引而不是值编写numpy where条件?

3
我有一个2d的numpy数组,需要提取所有满足以下条件array[i][j]的元素: x1range < i < x2rangey1range < j < y2range
我该如何编写这样的条件?我需要使用mgrid/ogrid吗?
编辑:我应该写出我的额外要求。我正在寻找一个where条件,而不是切片,因为我想将所有满足上述条件的元素的值更改为(0,0,0)。我假设如果我有一个where条件,我就可以这样做。
编辑2:还有一种可能得到上述条件的“not”的方法吗?
即: not(x1range < i < x2range and y1range < j < y2range)
if i > x1range and i < x2range and j > y1range and j < y2range: # the above condition
    do nothing # keep original value
else:
    val = (0,0,0)
3个回答

2

问题#1:获取范围内的索引

您可以使用np.meshgrid来获取这些索引 -

In [145]: x1range,x2range = 2,5
     ...: y1range,y2range = 1,4
     ...: 

In [146]: np.meshgrid(np.arange(x1range,x2range),np.arange(y1range,y2range))
Out[146]: 
[array([[2, 3, 4],
        [2, 3, 4],
        [2, 3, 4]]), array([[1, 1, 1],
        [2, 2, 2],
        [3, 3, 3]])]

问题 #2 : 在这些范围内提取或设置输入数组元素

您可以使用np.ix_直接索引输入数组arr -

In [148]: arr
Out[148]: 
array([[97, 69,  0, 60, 28, 97],
       [98, 85, 24, 75, 97, 23],
       [70, 25, 77, 86, 93, 66],
       [ 0, 85, 51, 17, 40, 92],
       [66, 28, 28, 22, 79, 52]])

In [149]: arr[np.ix_(np.arange(x1range,x2range),np.arange(y1range,y2range))]
Out[149]: 
array([[25, 77, 86],
       [85, 51, 17],
       [28, 28, 22]])

通过这种索引方式,您还可以直接设置所有这些元素。

问题#3:提取或设置不在这些范围内的输入数组元素

要将未满足的元素设置/提取为0s并保持其余部分不变,您可以使用NumPy广播以及布尔索引,如下所示 -

In [150]: Imask = np.in1d(np.arange(arr.shape[0]),np.arange(x1range,x2range))
     ...: Jmask = np.in1d(np.arange(arr.shape[1]),np.arange(y1range,y2range))
     ...: arr[~(Imask[:,None] & Jmask)] = 0
     ...: 

In [151]: arr
Out[151]: 
array([[ 0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0],
       [ 0, 25, 77, 86,  0,  0],
       [ 0, 85, 51, 17,  0,  0],
       [ 0, 28, 28, 22,  0,  0]])

嗨,我会尝试这个。还有一个额外的问题,如果我想反转这个查询怎么办?这是可能的吗?就是说,这个条件的“不”呢? - n00b
@n00b你能否编辑一下问题,并提供一个示例,阐明您所说的“不符合”条件的含义? - Divakar

0

只是猜测。

x=array[x1range:x2range,y1range:y2range]

为什么这段代码能够工作?您能否在回答中添加一些上下文信息? - pppery

0

切片怎么样?

array[x1range:x2range,y1range:y2range]

例子:

numpy.array([[1,2,3],[4,5,6],[7,8,9]])[0:2,0:2]
array([[1, 2],
       [4, 5]])

嗨,我添加了一个额外的要求。很抱歉之前没有提到。我正在寻找一个where条件,以便我可以更改满足给定条件的所有元素的值。 - n00b

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接