Разделить массив NumPy на подмассивы, когда последовательность имеет определенное значение на любом конце - PullRequest
0 голосов
/ 20 октября 2018

У меня есть массив значений следующим образом:

array([0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.00791667, 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.06837452, 0.09166667, 0.00370881, 0.        ,
       0.        , 0.00489809, 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.23888889, 0.        , 0.05927778,
       0.12138889, 0.        , 0.        , 0.        , 0.36069444,
       0.31711111, 0.16333333, 0.15005556, 0.01      , 0.005     ,
       0.14357413, 0.        , 0.15722222, 0.29494444, 0.3245    ,
       0.31276639, 0.095     , 0.04750292, 0.09127039, 0.        ,
       0.06847222, 0.17      , 0.18039233, 0.21567804, 0.15913079,
       0.4579781 , 0.        , 0.2459    , 0.14886556, 0.08447222,
       0.        , 0.13722222, 0.28336984, 0.0725    , 0.077355  ,
       0.45166391, 0.        , 0.24892933, 0.25360062, 0.        ,
       0.12923041, 0.16145892, 0.48771795, 0.38527778, 0.29432968,
       0.31983305, 1.07573089, 0.30611111, 0.        , 0.0216475 ,
       0.        , 0.62268056, 0.16829156, 0.46239719, 0.6415958 ,
       0.02138889, 0.76457155, 0.05711551, 0.35050949, 0.34856278,
       0.15686164, 0.23158889, 0.16593262, 0.34961111, 0.21247575,
       0.14116667, 0.19414785, 0.09166667, 0.93376627, 0.12772222,
       0.00366667, 0.10297222, 0.173     , 0.0381225 , 0.22441667,
       0.46686111, 0.18761111, 0.56037889, 0.47566111])

Из этого массива мне нужно вычислить площадь под кривой для каждого подмассива, где первое значение равно 0, где оно больше 0и последнее число должно быть 0 после ненулевого числа.Очевидно, длина массива будет варьироваться.Может также случиться, что два из этих подмассивов будут иметь значение 0 (последние 0 первого массива будут первыми 0, если второй массив).

Ожидаемые первые два массива должны быть:

[0.        ,           0.00791667, 0.        ]
[0.        , 0.06837452, 0.09166667, 0.00370881, 0.        ]

Я пробовал разбивать списки питонов на основе символов, равных 0, но не нашел ничего полезного.Что я могу сделать?

1 Ответ

0 голосов
/ 20 октября 2018

См. Код ниже - я думаю, что это наиболее эффективный способ, который вы сможете сделать.

Сначала разбейте массив, используя индексы всех нулей.Когда несколько нулей находятся вместе, это создает несколько [ 0. ] массивов, поэтому отфильтруйте их (по длине, поскольку все массивы обязательно должны начинаться с нуля), чтобы получить C. Наконец, так как все они начинаются с нуля, но ни один не заканчиваетсяноль, добавьте ноль к каждому массиву.

import numpy as np

# <Your array here>
A = np.array(...)

# Split into arrays based on zeroes
B = np.split(A, np.where(A == 0)[0])

# Filter out arrays of length 1
#  (just a zero, caused by multiple zeroes together)
f = np.vectorize(lambda a: len(a) > 1)
C = np.extract(f(B), B)

# Append a zero to each array
g = np.vectorize(lambda a: np.append(a, 0), otypes=[object])
D = g(C)

# Output result
for array in D:
    print(array)

Это дает следующий вывод:

[ 0.          0.00791667  0.        ]
[ 0.          0.06837452  0.09166667  0.00370881  0.        ]
[ 0.          0.00489809  0.        ]
[ 0.          0.23888889  0.        ]
[ 0.          0.05927778  0.12138889  0.        ]
[ 0.          0.36069444  0.31711111  0.16333333  0.15005556  0.01        0.005
  0.14357413  0.        ]
[ 0.          0.15722222  0.29494444  0.3245      0.31276639  0.095
  0.04750292  0.09127039  0.        ]
[ 0.          0.06847222  0.17        0.18039233  0.21567804  0.15913079
  0.4579781   0.        ]
[ 0.          0.2459      0.14886556  0.08447222  0.        ]
[ 0.          0.13722222  0.28336984  0.0725      0.077355    0.45166391
  0.        ]
[ 0.          0.24892933  0.25360062  0.        ]
[ 0.          0.12923041  0.16145892  0.48771795  0.38527778  0.29432968
  0.31983305  1.07573089  0.30611111  0.        ]
[ 0.         0.0216475  0.       ]
[ 0.          0.62268056  0.16829156  0.46239719  0.6415958   0.02138889
  0.76457155  0.05711551  0.35050949  0.34856278  0.15686164  0.23158889
  0.16593262  0.34961111  0.21247575  0.14116667  0.19414785  0.09166667
  0.93376627  0.12772222  0.00366667  0.10297222  0.173       0.0381225
  0.22441667  0.46686111  0.18761111  0.56037889  0.47566111  0.        ]
...