更改索引集

Change set of indices

我不知道我要找的东西的一般情况/单词,所以这里有一个例子。我创建一个矩阵

test = np.arange(0, 100, 1).reshape((5,5,-1))
idx = test > 50

现在 test[idx] 会给我 test > 50 的值。 idx 包含一组满足我的条件的元素。说 idx 的索引,其中 idx==TRUE 是(实际上不是真的,只是例子)

(1,1,1)
(2,1,1)
(3,1,1)
(4,2,4)

然后我想创建一个新矩阵 idx2,这样它只在

上有 TRUE 元素
(1,1,0)
(2,1,0)
(3,1,0)
(4,2,0)

也就是通俗地说,我在找

test > 50 & "switch axis=2 value from whatever it was to 0"

也许理解我的要求的人可以重新表述问题,尤其是标题,并删除我的绒毛...谢谢 :)

二维示例

不幸的是,如果 idx2 在 3d 情况下,我无法给出输出,但在不太有意义的 2d 情况下,这是 idx 的样子:

test = np.arange(0, 10, 1).reshape((5, -1), order='F')
idx = test > 5
idx
array([[False, False],
       [False,  True],
       [False,  True],
       [False,  True],
       [False,  True]], dtype=bool)

现在,test > 5 and reset axis=1 to 0 将是:

idx2
array([[False, False],
       [True,  False],
       [True,  False],
       [True,  False],
       [True,  False]], dtype=bool)

如果我理解这个问题,我认为您想使用 or 函数减少数组中的一个轴,类似于使用 python 内置函数 [=16] =].

Numpy 函数有一个类似于 reduce:

的方法
idx2 = np.zeros_like(idx)
idx2[:,:,0] = np.logical_or.reduce(idx, axis=2)

这是结果。我相信您希望它满足的条件是,对于 True 的任何 idx[i][j][k]idx2[i][j][0] 也是 True,对于 i 的任何其他值] 和 jidx2[i][j]0]False

我相信以下内容可以满足这一点。 这里有 idx:

array([[[False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False]],

       [[False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False]],

       [[False, False, False, False],
        [False, False, False, False],
        [False, False, False,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]],

       [[ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]],

       [[ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True],
        [ True,  True,  True,  True]]], dtype=bool)

这里是 idx2:

array([[[False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False]],

       [[False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False],
        [False, False, False, False]],

       [[False, False, False, False],
        [False, False, False, False],
        [ True, False, False, False],
        [ True, False, False, False],
        [ True, False, False, False]],

       [[ True, False, False, False],
        [ True, False, False, False],
        [ True, False, False, False],
        [ True, False, False, False],
        [ True, False, False, False]],

       [[ True, False, False, False],
        [ True, False, False, False],
        [ True, False, False, False],
        [ True, False, False, False],
        [ True, False, False, False]]], dtype=bool)

在更简单的 2d 情况下,

test = np.arange(0, 10, 1).reshape((5, -1), order='F')
idx = test > 5

idx2 = np.zeros_like(idx)
idx2[:,0] = np.logical_or.reduce(idx, axis=1)  # Note the reduction in dimension of the slicing, and that axis=1
idx2

array([[False, False],
       [ True, False],
       [ True, False],
       [ True, False],
       [ True, False]], dtype=bool)

一般函数

如果您想要一个通用函数,这里有一个适用于任意维数的函数:

def logical_flatten(array_in):
    array_out = np.zeros_like(array_in)
    array_out[[Ellipsis for k in range(len(array_in.shape)-1)]+[0]] = np.logical_or.reduce(array_in, axis=len(array_in.shape)-1)
    return array_out
test=np.arange(0,100,1).reshape(5,5,-1)
idx=test>50
X,Y,Z=np.nonzero(idx)

这些是您的非零索引,位于 3 个数组中。 现在复制一份,但 Z 全部为 0

idx1=np.zeros_like(idx)
idx1[X,Y,np.zeros_like(Z)]=True

np.nonzero(idx) 产生

(array([2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
        3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
        4, 4, 4], dtype=int32),
 array([2, 3, 3, 3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3,
        3, 3, 4, 4, 4, 4, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4,
        4, 4, 4], dtype=int32),
 array([3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1,
        2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3, 0,
        1, 2, 3], dtype=int32))

np.nonzero(idx1)

(array([2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4], dtype=int32),
 array([2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4], dtype=int32),
 array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], dtype=int32))

明显遗漏了 Y 它适用于您的二维示例。