在python中从一维数组和布尔数组创建二维数组
您好,我正在尝试从这些数组创建一个2d数组在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从
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]]