更改指数集

时间:2015-03-15 18:15:04

标签: python numpy scipy

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

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"

也许有人理解我的要求可以改写这个问题,特别是标题,并删除我的毛茸茸......谢谢:)

2d示例

我很遗憾无法在3d情况下给出idx2的输出,但在不太有意义的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)

2 个答案:

答案 0 :(得分:1)

如果我理解这个问题,我想你想使用or函数减少数组中的一个轴,类似于python内置reduce的方式。

Numpy函数有一个名为reduce的方法:

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

以下是结果。我相信您希望这一点满足的条件是idx[i][j][k] Trueidx2[i][j][0]也是Truei的任何其他值}和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

答案 1 :(得分:1)

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,它适用于你的第二个例子。