【问题标题】:Turning an np array into a jagged np array based on boolean conditions根据布尔条件将 np 数组转换为锯齿状 np 数组
【发布时间】:2017-12-04 14:55:21
【问题描述】:

假设我有一个数组 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的segment也一样。

【问题讨论】:

  • 你的意思是锯齿状数组吗?如果是这样,您要实施的规则是什么?因为我有一种非常简单且完全愚蠢的方式来做你想做的事,但我假设你心里有一些规则?
  • 查看我的编辑。
  • 预期的输出到底是什么 - 数组的锯齿状数组/列表的锯齿状数组/ jagged 数组列表/ jagged 列表列表?
  • 预期的输出实际上是 np 数组的锯齿状 np 数组。很抱歉造成混乱。
  • 没有jagged np array 这样的东西。数组可能包含不同长度的对象,包括列表或数组。

标签: python arrays numpy matrix boolean


【解决方案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]]

【讨论】:

    【解决方案2】:

    在 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
    

    【讨论】:

    • 如果 aouttmp 是 NumPy 数组,我该怎么做?
    • 对不起,我不知道如何使用numpy。但是,根据原始问题,接受的答案应该是我的。
    猜你喜欢
    • 2018-08-28
    • 2013-06-21
    • 2020-12-09
    • 2018-07-26
    • 2020-10-18
    • 2013-09-17
    • 2018-11-05
    • 1970-01-01
    相关资源
    最近更新 更多