【问题标题】:NumPy create new n-new arrays based on array indexNumPy 基于数组索引创建新的 n 个新数组
【发布时间】:2021-04-21 21:56:37
【问题描述】:

我正在尝试基于索引创建一个新数组,该索引是每行中的第一个元素。 我觉得我在这里遗漏了一些非常简单的东西。

数组看起来像这样,行中的第一个数字是索引。

[[ 1  0  1  2  3  4]
 [ 1  5  6  7  8  9]
 [ 2 10 11 12 13 14]
 [ 2 15 16 17 18 19]
 [ 4 20 21 22 23 24]]

我想要的结果是这样的:

数组 1:

range 1=
[[ 1  0  1  2  3  4]
 [ 1  5  6  7  8  9]]

数组 2:

range2 =
[[ 2 10 11 12 13 14]
[ 2 15 16 17 18 19]]

数组 3:

range 3=
[[ 4 20 21 22 23 24]]

这是我目前拥有的代码,但我有 N 个可能的索引号,我显然无法为所有这些索引号创建一个 if 语句。我打算使用一个列表,然后将该列表转换为一个 numpy 数组。在使用 hstack 之前我也看过压缩它们,但我也无法让它工作。

import numpy as np

data = np.arange(25).reshape(5,5)
indexList = np.array(([[1,1,2,2,4]]))
indexList = np.transpose(indexList)
array = np.hstack((indexList, data))

range1 = []
range2 = []
range3 = []
for row in array:
    if row[0] == 1:
        range1.append(row)
    if row[0] == 2:
        range2.append(row)
    if row[0] == 3:
        range3.append(row)

【问题讨论】:

    标签: python arrays numpy


    【解决方案1】:

    您可以使用您的ranges 创建一个numpy.array,如下所示:

    import numpy as np
    
    indices = np.unique(a[:, 0])
    size = len(indices)
    ranges = np.zeros((size,), dtype=object)
    
    for i in range(size):
        ranges[i] = a[a[:, 0] == indices[i]]
    

    然后,如果您打印出ranges,您将获得每个所需的数组。与 ranges 中的项目相关的索引(在您的情况下为 1、2 或 4)将由 indices 确定。

    >>> list(ranges)
        [array([[1, 0, 1, 2, 3, 4],
                [1, 5, 6, 7, 8, 9]]),
         array([[ 2, 10, 11, 12, 13, 14],
                [ 2, 15, 16, 17, 18, 19]]),
         array([[ 4, 20, 21, 22, 23, 24]])]
    

    【讨论】:

      【解决方案2】:

      您实际上是在尝试在 numpy 中进行分组,而 numpy 本身并没有很好的解决方案(尽管您可以查看一些 answers to similar questions)。

      我会将数组转换为 pandas 数据框,因为它们非常适合 groupby 操作,获取每个组的值,并将它们分配给字典键。然后,您可以像访问 dict 中的任何其他值一样访问它们:

      import pandas as pd
      df = pd.DataFrame(array)
      gb = df.groupby(0)
      dict_of_arrays = {f"range{g}": gb.get_group(g).to_numpy() for g in gb.groups.keys()}
      
      >> print(dict_of_arrays["range1"])
      [[1 0 1 2 3 4]
       [1 5 6 7 8 9]]
      
      >>> print(dict_of_arrays["range2"])
      [[ 2 10 11 12 13 14]
       [ 2 15 16 17 18 19]]
      
      >>> print(dict_of_arrays["range4"])
      [[ 4 20 21 22 23 24]]
      

      【讨论】:

      • 很好的答案谢谢,我认为会有某种内置的功能,但很高兴知道未来。我一直在尝试将所有内容保存在 numpy 中,所以我没有使用它,但我会确保保存它,谢谢!
      【解决方案3】:

      我建议引入一个嵌套列表以便于迭代,并将当前行与前一行进行比较。稍后您可以仅按索引拆分列表

      import numpy as np
      
      data = np.arange(25).reshape(5,5)
      indexList = np.array(([[1,1,2,2,4]]))
      indexList = np.transpose(indexList)
      array = np.hstack((indexList, data))
      
      range = [[]]
      n=row[0]
      for row in array:
          if row[0]!= n:
              n = row[0]
              range.append([])
              range[len(range)-1].append(row)
          else:
              range[len(range)-1].append(row)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-12
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 2021-11-25
        相关资源
        最近更新 更多