列表理解中的可变长度切片

时间:2020-07-03 22:26:51

标签: python list-comprehension slice

假设我有一个步长为N的小数组,还有一组长度为V的变量np.sum(N)。例如:

N = np.array([2,3,2])
V = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7])

最好使用列表推导方法,如何对V进行切片,使结果为列表列表,并按N中的步骤拆分?

例如:

foo(V, N)
> [[0.1,0.2], [0.3, 0.4,0.5], [0.6,0.7]]

4 个答案:

答案 0 :(得分:1)

numpy具有split()函数,该函数将为您提供不相等的数组。它需要索引而不是长度。您可以使用cumsum()来做到这一点,而忽略最后一个空值(如果不考虑整个列表,则忽略剩余值)。

N = np.array([2,3,2])
V = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7])

np.split(V, N.cumsum())[:-1]
# [array([0.1, 0.2]), array([0.3, 0.4, 0.5]), array([0.6, 0.7])]

答案 1 :(得分:1)

怎么样?

Vi = iter(V)
[[next(Vi) for _ in range(n)] for n in N]
# [[0.1, 0.2], [0.3, 0.4, 0.5], [0.6, 0.7]]

答案 2 :(得分:1)

我设法使用itertools.islice解决了这个问题:

    def UnequalDivide(self, iterable, chunks):
        it = iter(iterable)
        return [list(islice(it, c)) for c in chunks]

答案 3 :(得分:0)

在这里,您可以使用常规列表和切片来做到这一点:

N = [2,3,2]
V = [0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7]

def foo(N,V):
    n, lst = 0, []
    for i,v in enumerate(N, 1):
        lst.append(V[n:n+v])
        n += v
    return lst

print(foo(N,V))

输出:

[[0.1, 0.2], [0.3, 0.4, 0.5], [0.6, 0.7]]



您可以对numpy数组执行相同操作:

import numpy as np

N = np.array([2,3,2])
V = np.array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7])

def foo(N,V):
    n, lst = 0, []
    for i,v in enumerate(N, 1):
        lst.append(V[n:n+v].tolist())
        n += v
    return lst

print(foo(N,V))

输出:

[[0.1, 0.2], [0.3, 0.4, 0.5], [0.6, 0.7]]