您好,我正在尝试根据这些数组创建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值的新行。
请有人可以帮助我
答案 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]]