我有xy坐标,我试图在matplotlib中匹配长度。我需要x值列表来匹配y值嵌套列表模式,这样图表不会在列表之间画一条线,而是用每个嵌套列表开始和停止。
X(时间):
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0, 11.0, 12.0, ...]
Y(相)
[[1.0, 1.0, 1.0, 1.0, 1.0, 1.0], [2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 2.0, ...]]
列表长度会有所不同,每个嵌套列表的长度也会有所不同。
答案 0 :(得分:1)
如果您的列表是锯齿状的(假设元素总数相等),您可以迭代y
,在迭代时从x
创建块。
x = [2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2]
y = [[1,1,1], [1,1,1,1], [1,1,1,1,1], [1,1,1,1,1,1,1,1,1,1], [1,1,1,1,1,1,1,1]]
curi = 0
fin = []
for i in y:
fin.append(x[curi:curi+len(i)])
curi += len(i)
print(fin)
输出:
[[2, 2, 2], [2, 2, 2, 2], [2, 2, 2, 2, 2], [2, 2, 2, 2, 2, 2, 2, 2, 2, 2], [2, 2, 2, 2, 2, 2, 2, 2]]
如果你列出不锯齿状:
x.reshape(y.shape)
答案 1 :(得分:0)
您可以使用np.split
,它会在作为第二个参数提供的索引处分解数组或列表:
# create random example
>>> y = [list(np.random.randint(0, 10, (np.random.randint(3, 10),))) for j in range(10)]
>>> x = list(np.random.randint(0, 10, (sum(map(len, y)),)))
>>> y
[[6, 8, 4, 5], [1, 3, 6, 3, 7, 8], [1, 5, 9, 6, 4], [2, 7, 3], [8, 3, 6, 8], [0, 6, 4, 4, 6, 9], [5, 4, 8, 3, 8, 1], [6, 4, 7, 2], [2, 1, 0], [2, 2, 5, 7]]
>>> x
[6, 7, 3, 4, 1, 4, 4, 8, 2, 7, 0, 9, 8, 7, 9, 9, 6, 0, 5, 5, 2, 2, 5, 5, 4, 4, 5, 4, 2, 1, 4, 5, 3, 5, 0, 4, 7, 0, 4, 3, 3, 7, 7, 5, 3]
# split
>>> xs = np.split(x, np.cumsum(np.fromiter(map(len, y), int, count=len(y)-1)))
>>> xs
[array([6, 7, 3, 4]), array([1, 4, 4, 8, 2, 7]), array([0, 9, 8, 7, 9]), array([9, 6, 0]), array([5, 5, 2, 2]), array([5, 5, 4, 4, 5, 4]), array([2, 1, 4, 5, 3, 5]), array([0, 4, 7, 0]), array([4, 3, 3]), array([7, 7, 5, 3])]