根据值拆分Numpy数组

H.B*_*ari 9 python numpy

假设我有这个NumPy数组:

a = np.array([0, 3, 5, 5, 0, 10, 14, 15, 56, 0, 12, 23, 45, 23, 12, 45, 
              0, 1, 0, 2, 3, 4, 0, 0 ,0])
Run Code Online (Sandbox Code Playgroud)

我想在0之间打印所有数字并自动将它们添加到新的数字中np.array(见下文):

a1=[3, 5, 5]
a2=[10, 14, 15, 56]
a3=[12, 23, 45, 23, 12, 45]
a4=[1]
a5=[2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

是否有内置函数来执行此操作?

Psi*_*dom 7

您可以使用groupby()函数from itertools,并将其指定key为零或非零的布尔条件.以这种方式,所有连续的零和非零将被组合在一起.使用if过滤器拾取非零组并用于list将非零石斑鱼转换为列表.

from itertools import groupby
[list(g) for k, g in groupby(a, lambda x: x != 0) if k]

# [[3, 5], [10, 14, 15, 56], [12, 23, 45, 23, 12, 45], [1], [2, 3, 4]]
Run Code Online (Sandbox Code Playgroud)


Div*_*kar 5

这是使用np.where和的矢量化方法np.split-

idx = np.where(a!=0)[0]
aout = np.split(a[idx],np.where(np.diff(idx)!=1)[0]+1)
Run Code Online (Sandbox Code Playgroud)

样品运行 -

In [23]: a
Out[23]: 
array([ 0,  3,  5,  5,  0, 10, 14, 15, 56,  0,  0,  0, 12, 23, 45, 23, 12,
       45,  0,  1,  0,  2,  3,  4,  0,  0,  0])

In [24]: idx = np.where(a!=0)[0]

In [25]: np.split(a[idx],np.where(np.diff(idx)!=1)[0]+1)
Out[25]: 
[array([3, 5, 5]),
 array([10, 14, 15, 56]),
 array([12, 23, 45, 23, 12, 45]),
 array([1]),
 array([2, 3, 4])]
Run Code Online (Sandbox Code Playgroud)