如何在3D Numpy数组的每一列中查找连续1的组数

时间:2019-01-16 18:09:28

标签: python

例如,我有这个:

 [[[1 0 1 0 1 0]
   [1 1 0 0 1 0]
   [0 1 1 0 1 0]
   [0 0 0 0 1 0]
   [1 0 1 0 1 0]
   [1 0 0 0 0 0]]

     [[1 0 1 0 1 0]
      [1 1 0 0 1 0]
      [0 1 1 1 1 0]
      [0 0 0 1 0 0]
      [1 0 1 1 1 0]
      [1 1 0 0 1 0]]]

我想拥有

 [[[2 1 3 0 1 0]        
   [[2 2 3 1 2 0]]

当然这是一种简化,我的numpy数组形状为(124,7650,18)。 我知道有一个简单的方法,但是我找不到它。

1 个答案:

答案 0 :(得分:3)

我们可以使用np.diff来计算给定轴上先前值之间的差:

import numpy as np
np.diff(x, axis = 1)
array([[[ 0,  1, -1,  0,  0,  0],
        [-1,  0,  1,  0,  0,  0],
        [ 0, -1, -1,  0,  0,  0],
        [ 1,  0,  1,  0,  0,  0],
        [ 0,  0, -1,  0, -1,  0]],

       [[ 0,  1, -1,  0,  0,  0],
        [-1,  0,  1,  1,  0,  0],
        [ 0, -1, -1,  0, -1,  0],
        [ 1,  0,  1,  0,  1,  0],
        [ 0,  1, -1, -1,  0,  0]]])

然后我们想在每次“切换”到1时计数:因此差异为1。

np.sum(np.diff(x, axis = 1) == 1, axis = 1)
array([[1, 1, 2, 0, 0, 0],
       [1, 2, 2, 1, 1, 0]])

但是,这样做,我们会错过那些以1开头的列,因此我们可以重新添加它们,为您提供答案:

np.sum(np.diff(x, axis = 1) == 1, axis = 1) + x[:,0,:]
array([[2, 1, 3, 0, 1, 0],
       [2, 2, 3, 1, 2, 0]])