如何将一个numpy数组列表分成n个子列表

3

我有一个存储在列表中的数组,并希望将该列表拆分成子列表。这是我的列表:

all_data=[np.array([[1., 2.]]), np.array([[7., 7.], [4., 1.]]),\
          np.array([[-1., 4.], [1., 9.]]), np.array([[3., 0.]]),\
          np.array([[0., -2.]]), np.array([[6., 1.], [3., 5.]])]

它有6个数组,我想把它分成两个子列表。第一个子列表包括前三个数组,第二个子列表包括后三个数组。结果如下:

spl_data=[[np.array([[1., 2.]]), np.array([[7., 7.], [4., 1.]]),\
           np.array([[-1., 4.], [1., 9.]])],\
          [np.array([[3., 0.]]),\
           np.array([[0., -2.]]), np.array([[6., 1.], [3., 5.]])]]

我尝试了以下函数:

def chunks(lst, n):
    for i in range(0, len(lst), n):
        yield lst[i:i + n]

接着我尝试了以下方法来达到想要的结果,但是并没有成功:

n=2
spl_data=list(chunks(all_data, n))

我非常感激您提前的帮助。


2
https://numpy.org/doc/stable/reference/generated/numpy.split.html - Arpit Choudhary
亲爱的@Arpit Choudhary,如果我的“n”是另一个数字,我该如何解决它? - Ali_d
1
预期结果是什么?您可以使用a,b = all_data[:3],all_data[3:]来拆分列表,这与numpy无关(或者将a,b = ...替换为spl_data = ...)。 - Pierre D
1
这个回答有帮助吗?链接 - Pierre D
亲爱的@Pierre D,我正在使用相同的方法,但“n”数字是块的大小,而不是块的数量。 - Ali_d
显示剩余2条评论
2个回答

2
def chunkIt(all_data, num):
avg = len(all_data) / float(num)
out = []
last = 0.0

while last < len(all_data):
    out.append(all_data[int(last):int(last + avg)])
    last += avg

return out

1
正如我在评论中所说,如果只是关于拆分列表all_data,那么该列表内部的内容无关紧要,这个问题与numpy无关。
一个非常相关的问题是如何将列表均匀地分成大小相等的块?
然而,在这种情况下,OP想要指定块的数量,而不是它们的大小。事实证明,处理潜在的不均匀长度的一种方便方法是使用np.linspace()
def split(lst, n):
    """Split a list into exactly n sub-lists, as evenly as possible."""
    ix = np.linspace(0, len(lst), n + 1, dtype=int)
    return [lst[i:j] for i, j in zip(ix[:-1], ix[1:])]

例子:

>>> split([1,2,3,4,5], 2)
[[1, 2], [3, 4, 5]]

>>> split([1,2,3,4,5], 3)
[[1], [2, 3], [4, 5]]

>>> split([1,2,3,4,5], 6)
[[], [1], [2], [3], [4], [5]]

对于您的使用:

>>> spl_data = split(all_data, 2)
[[array([[1., 2.]]),
  array([[7., 7.],
         [4., 1.]]),
  array([[-1.,  4.],
         [ 1.,  9.]])],
 [array([[3., 0.]]),
  array([[ 0., -2.]]),
  array([[6., 1.],
         [3., 5.]])]]

亲爱的@Pierre D,感谢您提供的解决方案,但实际上我有几个子列表,如果手动设置每个子列表的大小,那将会很麻烦。 - Ali_d

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接