基于布尔条件将np数组转换为锯齿状np数组

时间:2017-06-30 15:26:01

标签: python arrays numpy matrix boolean

假设我的数组x等于np.array(0 0 0 0 0 0 0 0 1000 0 0 0 0 1000 1000 1000)

我希望将其变成矩阵array([array([0 0 0 0 0 0 0 0]), array([1000]), array([0 0 0 0]), array([1000 1000 1000])])。我该怎么做?

布尔条件是,如果它是一个0的字符串,则将其分段,使其成为矩阵内的一个数组。如果它是一个1000段的字符串,它的方式相同。

2 个答案:

答案 0 :(得分:1)

在python中试试这个:

a = [0, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1000, 1000, 1000]
out = []
flag = 0
tmp = []
for i in a:
    if not flag and i==0:
        tmp.append(i)
    elif not flag and i==1000:
        out.append(tmp)
        tmp=[i]
        flag=1
    elif flag and i==1000:
        tmp.append(i)
    else:
        out.append(tmp)
        tmp=[i]
        flag=0
out.append(tmp)
print out

答案 1 :(得分:1)

这是np.split -

的一种方法
m = x!=0
out = np.split(x,np.flatnonzero(m[1:] != m[:-1])+1)

示例运行 -

In [53]: x = np.array([0, 0, 0, 0, 0, 0, 0, 0, 1000, 0, 0, 0, 0, 1000, 1000, 1000])

In [54]: m = x!=0

In [55]: np.split(x,np.flatnonzero(m[1:] != m[:-1])+1)
Out[55]: 
[array([0, 0, 0, 0, 0, 0, 0, 0]),
 array([1000]),
 array([0, 0, 0, 0]),
 array([1000, 1000, 1000])]

要将数组数组作为输出,请使用np.array() -

进行包装
In [56]: np.array(np.split(x,np.flatnonzero(m[1:] != m[:-1])+1))
Out[56]: 
array([array([0, 0, 0, 0, 0, 0, 0, 0]), array([1000]), array([0, 0, 0, 0]),
       array([1000, 1000, 1000])], dtype=object)

列表作为输出列表,这是单向的 -

m = x!=0
idx = np.r_[0, np.flatnonzero(m[1:] != m[:-1])+1, x.size]
out = [x.tolist()[idx[i]:idx[i+1]] for i in range(len(idx)-1)]

示例运行 -

In [94]: m = x!=0

In [95]: idx = np.r_[0, np.flatnonzero(m[1:] != m[:-1])+1, x.size]

In [96]: [x.tolist()[idx[i]:idx[i+1]] for i in range(len(idx)-1)]
Out[96]: [[0, 0, 0, 0, 0, 0, 0, 0], [1000], [0, 0, 0, 0], [1000, 1000, 1000]]