Python:在不使用groupby的情况下在3D numpy数组中查找连续值?

时间:2017-06-08 15:20:05

标签: python arrays numpy probability itertools

假设你有以下3D numpy数组:

matrices=
numpy.array([[[1, 0, 0], #Level 0
              [1, 1, 1],
              [0, 1, 1]],

             [[0, 1, 0], #Level 1
              [1, 1, 0],
              [0, 0, 0]],

             [[0, 0, 1], #Level 2
              [0, 1, 1],
              [1, 0, 1]]])

并且您想要计算每个单元格的连续值为1的次数。假设您想要为每个单元格计算2和3个连续值1的出现次数。结果应该是这样的:

two_cons=([[0,0,0],
           [1,1,0],
           [0,0,0]])
three_cons=([[0,0,0],
             [0,1,0],
             [0,0,0]])

意味着两个单元格至少有2个连续值为1,而且只有一个单元格有3个连续值。

我知道这可以通过使用groupby,为每个单元格提取“垂直”值系列,以及计算连续n次连续的次数来完成:

import numpy
two_cons=numpy.zeros((3,3))
for i in range(0,matrices.shape[0]): #Iterate through each "level"
    for j in range(0,matrices.shape[1]):
        vertical=matrices[:,i,j] #Extract the series of 0-1 for each cell of the matrix
        #Determine the occurrence of 2 consecutive values
        cons=numpy.concatenate([numpy.cumsum(c) if c[0] == 1 else c for c in numpy.split(vertical, 1 + numpy.where(numpy.diff(vertical))[0])])
        two_cons[i][j]=numpy.count_nonzero(cons==2)

在这个例子中,你得到了:

two_cons=
array([[ 0.,  0.,  0.],
       [ 1.,  1.,  0.],
       [ 0.,  0.,  0.]])

我的问题:如果我无法访问 vertical ,我怎么能这样做?在我的实际案例中,3D numpy数组太大,我无法提取垂直系列很多级别,所以我必须一次遍历每个级别,并记住前一个n级别发生的事情。你有什么建议吗?

1 个答案:

答案 0 :(得分:2)

我还没有检查过代码,但是这样的东西应该有用......想法是沿着第三维扫描矩阵并有2个辅助矩阵,一个跟踪实际序列的长度那些,一个跟踪到目前为止遇到的最佳序列。

bests = np.zeros(matrices.shape[:-1])
counter = np.zeros(matrices.shape[:-1])

for depth in range(matrices.shape[0]):
    this_level = matrices[depth, :, :]
    counter = counter * this_level + this_level
    bests = (np.stack([bests, counter], axis=0)).max(axis=0)

two_con = bests > 1
three_con = bests > 2