在python中从一维数组和布尔数组创建二维数组

在python中从一维数组和布尔数组创建二维数组,python,numpy,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从

您好,我正在尝试从这些数组创建一个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值的新行


请有人帮助我

常规整数NumPy数组不能有锯齿形状,例如,对于二维数组,每行必须有相同的列数。但您可以通过以下方式创建阵列列表:

或对于列表列表:

from operator import methodcaller

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

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

这里有一个使用生成器的方法。没有真正的理由使用生成器而不是函数实际上,这正是我第一次跳到的

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]]

该算法循环通过
A
,将连续的
true
A
值累加到
D
,直到遇到
false
A
值,并且仅在
D
值累加到
C
中时才将
D
添加到
中。最后,在最后一个循环中,如果
D
有任何值,则再次将
D
附加到
C

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)
结果:

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

使用
[1::2]
只有在B数组的第一个元素为
False
时才是正确的。如果第一个元素是
True
,它应该是
[0::2]
最简单的方法可能是
np.split(A,np.where(np.diff(B)==1)[0]+1][(0如果B[0]否则1)::2]
。在这一点上,它开始失去可读性though@user8408080,是的,只是碰巧用字典解决方案更新了。。因为主题是功能性的。实际上,你也可以选择
而不是B[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]]