在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]])]