在Python中从1D数组和布尔数组创建2D数组

时间:2019-01-05 01:18:33

标签: python numpy

您好,我正在尝试根据这些数组创建2d数组

A=[5, 7, 1, -3, 0, 2, 2, 7, 10, 11, -1, 8, 5, 18, 9]

B=[False, False, True, True, True, False, True, True, False, False, False, True, False, True, True]

我希望得到这样的矩阵

C= [[1, -3, 0],
    [2, 7],
    [8],
    [18,9]]

也就是说,每次将数组B从False更改为True时,都要创建一个具有连续True值的新行。

请有人可以帮助我

4 个答案:

答案 0 :(得分:3)

常规整数NumPy数组不能呈锯齿状,例如对于二维数组,每一行必须具有相同数量的列。但是您可以通过np.split创建数组列表:

lst_of_array = np.split(A, np.where(np.diff(B) == 1)[0]+1)[{0:1,1:0}[B[0]]::2]

# [array([ 1, -3,  0]),
#  array([2, 7]),
#  array([8]),
#  array([18,  9])]

或获取列表列表:

from operator import methodcaller

lst_of_lst = list(map(methodcaller('tolist'), lst_of_array))

# [[1, -3, 0],
#  [2, 7],
#  [8],
#  [18, 9]]

答案 1 :(得分:0)

这是使用生成器的方法。没有真正的理由要使用生成器而不是实际使用函数,这只是我最初跳到的内容。

def splitter(A, B):
    sublist = []
    for item, check in zip(A, B):
        if not check:
            if sublist:
                yield sublist 
                sublist = []
        else:
            sublist.append(item)
    if sublist:
        yield sublist

A = [5, 7, 1, -3, 0, 2, 2, 7, 10, 11, -1, 8, 5, 18, 9]
B = [False, False, True, True, True, False, True, True, False, False, False, True, False, True, True]

list(splitter(A, B))

输出:

[[1, -3, 0], [2, 7], [8], [18, 9]]

答案 2 :(得分:0)

此算法遍历A,将连续的true A值累加到D中,直到遇到false A值为止,并且仅在D中累积了C个值的情况下才将true添加到D中。最后,如果C有任何值,则在最后一个循环中,将D追加到C = [] D = [] for i in range(len(A)): if B[i]: D.append(A[i]) elif len(D): C.append(D) D = [] if i == len(A)-1 and len(D): C.append(D) 上。

int k = s;

答案 3 :(得分:0)

from itertools import groupby, ifilter, izip
from operator import itemgetter

get_0 = itemgetter(0)

A=[5, 7, 1, -3, 0, 2, 2, 7, 10, 11, -1, 8, 5, 18, 9]
B=[False, False, True, True, True, False, True, True, False, False, False, True, False, True, True]

list((list((vv for _, vv in v))
    for _, v in
       ifilter(get_0, groupby(izip(B,A), get_0))))

结果:

[[1, -3, 0], [2, 7], [8], [18, 9]]