当前位置: 首页 > 知识库问答 >
问题:

根据另一个数组的值(不是排序,而是分组)将一个NumPy数组拆分成子数组

孙修贤
2023-03-14

假设我有两个 NumPy 数组

x = [[1, 2, 8],
     [2, 9, 1],
     [3, 8, 9],
     [4, 3, 5],
     [5, 2, 3],
     [6, 4, 7],
     [7, 2, 3],
     [8, 2, 2],
     [9, 5, 3],
     [10, 2, 3],
     [11, 2, 4]]
y = [0, 0, 1, 0, 1, 1, 2, 2, 2, 0, 0] 

注意:(x中的值没有以任何方式排序。我选择这个例子是为了更好地说明这个例子)(这只是xy的两个例子。xy的值可以是任意多个不同的数字,y可以有任意不同的数字,但是x中的值总是和y中的值一样多)

我想根据y中的值有效地将数组x拆分为子数组。

我想要的输出是

z_0 = [[1, 2, 8],
       [2, 9, 1],
       [4, 3, 5],
       [10, 2, 3],
       [11, 2, 4]]
z_1 = [[3, 8, 9],
       [5, 2, 3],
       [6, 4, 7],]
z_2 = [[7, 2, 3],
       [8, 2, 2],
       [9, 5, 3]]

假设 y 从零开始并且没有排序而是分组,最有效的方法是什么?

注意:这个问题是这个问题的未排序版本:根据另一个数组的值(按升序排序)将NumPy数组拆分为子数组

共有3个答案

涂浩皛
2023-03-14

轻微的变化。

from operator import itemgetter
label = itemgetter(1)

将隐含信息与标签相关联...<代码>(索引,标签)

y1 = [thing for thing in enumerate(y)]

在标签上排序

y1.sort(key=label)

按标签分组并构建结果

import itertools
d = {}
for key,group in itertools.groupby(y1,label):
    d[f'z{key}'] = [x[i] for i,k in group]

熊猫解决方案:

>>> import pandas as pd
>>> >>> df = pd.DataFrame({'points':[thing for thing in x],'cat':y})
>>> z = df.groupby('cat').agg(list)
>>> z       
                                                points
cat
0    [[1, 2, 8], [2, 9, 1], [4, 3, 5], [10, 2, 3], ...
1                    [[3, 8, 9], [5, 2, 3], [6, 4, 7]]
2                    [[7, 2, 3], [8, 2, 2], [9, 5, 3]]
储嘉悦
2023-03-14

只需使用列表理解和布尔索引

x = np.array(x)
y = np.array(y)

z = [x[y == i] for i in range(y.max() + 1)]

z
Out[]: 
[array([[ 1,  2,  8],
        [ 2,  9,  1],
        [ 4,  3,  5],
        [10,  2,  3],
        [11,  2,  4]]),
 array([[3, 8, 9],
        [5, 2, 3],
        [6, 4, 7]]),
 array([[7, 2, 3],
        [8, 2, 2],
        [9, 5, 3]])]
方子安
2023-03-14

解决此问题的一种方法是为每个y值建立一个过滤器索引列表,然后只需选择x的那些元素。例如:

z_0 = x[[i for i, v in enumerate(y) if v == 0]]
z_1 = x[[i for i, v in enumerate(y) if v == 1]]
z_2 = x[[i for i, v in enumerate(y) if v == 2]]

输出

array([[ 1,  2,  8],
       [ 2,  9,  1],
       [ 4,  3,  5],
       [10,  2,  3],
       [11,  2,  4]])
array([[3, 8, 9],
       [5, 2, 3],
       [6, 4, 7]])
array([[7, 2, 3],
       [8, 2, 2],
       [9, 5, 3]])

如果您想更通用,并支持y中的不同数字集,您可以使用理解来生成数组列表,例如。

z = [x[[i for i, v in enumerate(y) if v == m]] for m in set(y)]

输出:

[array([[ 1,  2,  8],
       [ 2,  9,  1],
       [ 4,  3,  5],
       [10,  2,  3],
       [11,  2,  4]]),
 array([[3, 8, 9],
       [5, 2, 3],
       [6, 4, 7]]),
 array([[7, 2, 3],
       [8, 2, 2],
       [9, 5, 3]])]

如果 y 也是一个 np.array 并且长度与 x 相同,则可以将其简化为使用布尔索引:

z = [x[y==m] for m in set(y)]

输出同上。

 类似资料:
  • 假设我有两个NumPy数组 我希望根据中的值,将数组有效地拆分为子数组。 我想要的输出是 假设以零开始并按升序排序,那么最有效的方法是什么? 注意:这个问题是这个问题的排序版本:根据另一个数组的值(未排序,而是分组)将NumPy数组拆分为子数组

  • 问题内容: 如何有效地检查整数数组中的所有元素是否是Java中另一个数组的所有元素的子集?例如,[33 11 23]是[11 23 33 42]的子集。提前致谢。 问题答案: 从超集数组中取出一个。检查子集中数组的每个元素是否包含在中。这是非常快速的操作。

  • 问题内容: 在SO上已经问过类似的问题,但是它们有更具体的约束,其答案不适用于我的问题。 一般来说,确定任意numpy数组是否是另一个数组的子集的最有效方法是什么?更具体地说,我有大约20000x3的数组,我需要知道完全包含在集合中的1x3元素的索引。更普遍地讲,是否有更Python化的方式编写以下代码: 对于我的用例,我可以安全地假设len(master)<<20000。(因此,可以安全地假设m

  • 问题内容: 是否可以对看起来像这样的数组进行排序和重新排列: 匹配此数组的安排: 不幸的是,我没有任何要跟踪的ID。我将需要优先处理items-array,以使其尽可能接近sortingArr。 更新: 这是我正在寻找的输出: 任何想法如何做到这一点? 问题答案: 就像是: 这是一个较短的代码,但是会破坏数组:

  • 这是一个流行的问题,但我找不到一个满足我案例的答案。 我有布尔数组,其中我试着看一个数组是不是另一个数组的子集。 示例: 在本例中,不是两者的子集,但是的子集。 我尝试了一些从布尔的真值创建整数数组的麻烦尝试,但我仍然不确定如何验证它们是按顺序排列的(即一个子集)。 这个也没用。 目标是确定一个数组是否包含另一个数组的所有元素。在这种情况下,将索引4和5作为true,这在中也是true 但是如果我