Python 如何基于元组内容拆分numpy数组?

Python 如何基于元组内容拆分numpy数组?,python,numpy,Python,Numpy,假设我有一个数组[0,1,2,3,4,5,6,7]和一个元组:(3,3,2) 我正在寻找一种基于元组数据将数组拆分为3数组的方法: [0, 1, 2] [3, 4, 5] [6, 7] 我可以编写这样一个简单的代码来获得我想要的,但是我正在寻找一种正确的python方法来实现这一点: 为了简单起见,我使用了列表 a = [0, 1, 2, 3, 4, 5, 6, 7] b = (3, 3, 2) pointer = 0 for i in b: lst = []

假设我有一个数组
[0,1,2,3,4,5,6,7]
和一个元组:
(3,3,2)

我正在寻找一种基于元组数据将数组拆分为
3
数组的方法:

[0, 1, 2]
[3, 4, 5]
[6, 7]

我可以编写这样一个简单的代码来获得我想要的,但是我正在寻找一种正确的python方法来实现这一点:

为了简单起见,我使用了列表

a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)

pointer = 0
for i in b:
        lst = []
        for j in range(i):
                lst.append(a[pointer])
                pointer += 1
        print(lst)
或者这个:

a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)
pointer = 0
for i in b:
        lst = a[pointer:pointer+i]
        pointer += i
        print(lst)
结果:

[0, 1, 2]
[3, 4, 5]
[6, 7]

一个简单的方法是:

a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)

for ind in b:
    print(a[:ind])
    a = a[ind:]
它循环通过
b
中的切片大小,同时每次都缩短原始数组。如果需要将结果切片附加到其他内容中,则可以轻松地将其附加为子列表。它几乎与您的一个解决方案相似,只是它不使用任何额外的变量,直接迭代
b
的元素


此外,我不会将变量称为
a
b
——当然,在这种情况下,变量具有清晰的含义,可以通过它们的名称来表达。更有意义的名称可以减少bug数量,使代码更加清晰,与更大/更复杂的代码相比,这是一个真正的区别。我会在列表中调用
a
至少
b
切片
,但如果有更多上下文,这可能会更好。

如果不想修改输入列表,可以使用迭代器和

在第一步中,创建一个迭代器,它从
a
的第一个元素开始。然后在a中对
b
中的数字进行迭代,并在每个步骤中相应地从迭代器中提取许多元素,并将它们存储在结果列表中。

最“简洁”的语法是:

exu数组=[0,1,2,3,4,5,6,7] extuple=(3,3,2)


结果将是一个预期子列表的列表

您可以使用numpy的拆分方法

import numpy as np

a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)

c = np.split(a, np.cumsum(b)[:-1])

for r in c:
    print(r)

np.split(a,b)通过b中的索引沿给定轴(默认为0)拆分a。

如果使用中的
成对功能,您还可以:

from itertools import accumulate
from more_itertools import pairwise

a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)

[a[slice(*s)] for s in pairwise(accumulate((0,)+b))]

begin说,
np.split
答案可能更快(也更容易阅读)。

通常海报询问数组时会让人讨厌,但请提供一个列表示例。在这里,这只是一个烦恼。也就是说,
np.array\u split
的操作与第二个解决方案非常类似,使用切片。但它需要一个累积元组。@hpaulj你说得对。。。很抱歉。
import numpy as np

a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)

c = np.split(a, np.cumsum(b)[:-1])

for r in c:
    print(r)
from itertools import accumulate
from more_itertools import pairwise

a = [0, 1, 2, 3, 4, 5, 6, 7]
b = (3, 3, 2)

[a[slice(*s)] for s in pairwise(accumulate((0,)+b))]