假设我有一个步长为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]]
答案 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]]