Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python/numpy中,如何根据数组的第一列(即索引)分解/拆分数组?_Python_Arrays_Numpy_Split_Indexing - Fatal编程技术网

在Python/numpy中,如何根据数组的第一列(即索引)分解/拆分数组?

在Python/numpy中,如何根据数组的第一列(即索引)分解/拆分数组?,python,arrays,numpy,split,indexing,Python,Arrays,Numpy,Split,Indexing,此问题与密切相关,但我正在寻找一种更通用的方法,在给定未知数量索引的情况下拆分数组: import numpy as np a=np.arange(10,40).reshape(10,3) b=np.array([[1],[1],[1],[2],[2],[3],[3],[4],[4],[5]]) c=np.hstack((b,a)) array([[ 1, 10, 11, 12], [ 1, 13, 14, 15], [ 1, 16, 17, 18],

此问题与密切相关,但我正在寻找一种更通用的方法,在给定未知数量索引的情况下拆分数组:

import numpy as np
a=np.arange(10,40).reshape(10,3)
b=np.array([[1],[1],[1],[2],[2],[3],[3],[4],[4],[5]])
c=np.hstack((b,a))

array([[ 1, 10, 11, 12],
       [ 1, 13, 14, 15],
       [ 1, 16, 17, 18],
       [ 2, 19, 20, 21],
       [ 2, 22, 23, 24],
       [ 3, 25, 26, 27],
       [ 3, 28, 29, 30],
       [ 4, 31, 32, 33],
       [ 4, 34, 35, 36],
       [ 5, 37, 38, 39]])
我想根据第一列将其拆分为1x2x2数组,因此:

array([[[ 1, 10, 11, 12],
        [ 1, 13, 14, 15],
        [ 1, 16, 17, 18]],

       [[ 2, 19, 20, 21],
        [ 2, 22, 23, 24]],

       [[ 3, 25, 26, 27],
        [ 3, 28, 29, 30]],

       [[ 4, 31, 32, 33],
        [ 4, 34, 35, 36]],

       [[ 5, 37, 38, 39]]])

我是Python新手,因此提前感谢您的帮助

在纯python中,您可以使用itertools.groupby执行此操作:

使用NumPy:


在纯python中,您可以使用itertools.groupby执行此操作:

使用NumPy:



顺便说一下,如果你能用的话。它有很多方便的内置函数来实现这类功能。在这种情况下,您可以很容易地从数据中创建,将第一列设置为索引,或使用“按公共第一列值分组”。@EMS-groupby在pandas中可以工作,但将第一列设置为索引将导致唯一性错误。面板也不好,因为它们需要平方数据。您的预期输出实际上不可能是numpy中的整数数组,因为它没有统一的形状。在实践中,它是合法的,因为它将有效地成为五个麻木阵列的列表NUMPY对象数组。@ PhilCooper新版本的熊猫允许用重复的索引。它有很多方便的内置函数来实现这类功能。在这种情况下,您可以很容易地从数据中创建,将第一列设置为索引,或使用“按公共第一列值分组”。@EMS-groupby在pandas中可以工作,但将第一列设置为索引将导致唯一性错误。面板也不好,因为它们需要平方数据。您的预期输出实际上不可能是numpy中的整数数组,因为它没有统一的形状。实际上,它是合法的,因为它将有效地成为一个包含五个numpy数组的列表numpy对象数组。@PhilCooper Pandas的较新版本允许索引具有重复项。谢谢@Ashwini Chaudhary-但我不确定这是否正是我想要的。1:5的数组仍然全部分组在一起:我想要5组单独的数组。这可能吗?谢谢。@user2974839我不明白,返回的列表是一个包含五个独立组的列表。@user2974839还检查我的NumPy解决方案。啊哈,我喜欢你的NumPy解决方案。谢谢@歪歪扭扭的。不奇怪,只是把它隔开。修正了它谢谢你@Ashwini Chaudhary-但我不确定这正是我想要的。1:5的数组仍然全部分组在一起:我想要5组单独的数组。这可能吗?谢谢。@user2974839我不明白,返回的列表是一个包含五个独立组的列表。@user2974839还检查我的NumPy解决方案。啊哈,我喜欢你的NumPy解决方案。谢谢@歪歪扭扭的。不奇怪,只是把它隔开。修好了
>>> from operator import itemgetter
>>> from itertools import groupby
>>> from pprint import pprint
>>> pprint ([list(g) for k, g in groupby(c, key=itemgetter(0))])
[[array([ 1, 10, 11, 12]), array([ 1, 13, 14, 15]), array([ 1, 16, 17, 18])],
 [array([ 2, 19, 20, 21]), array([ 2, 22, 23, 24])],
 [array([ 3, 25, 26, 27]), array([ 3, 28, 29, 30])],
 [array([ 4, 31, 32, 33]), array([ 4, 34, 35, 36])],
 [array([ 5, 37, 38, 39])]]
>>> e, inds = np.unique(c[:,0], return_index=True)
>>> np.split(c, inds)[1:]
[array([[ 1, 10, 11, 12],
       [ 1, 13, 14, 15],
       [ 1, 16, 17, 18]]),
 array([[ 2, 19, 20, 21],
       [ 2, 22, 23, 24]]),
 array([[ 3, 25, 26, 27],
       [ 3, 28, 29, 30]]),
 array([[ 4, 31, 32, 33],
       [ 4, 34, 35, 36]]),
 array([[ 5, 37, 38, 39]])]