使用值数组将 numpy 分组为多个子数组

2023-11-24

我有一系列沿直线的点:

a = np.array([18, 56, 32, 75, 55, 55])

我有另一个数组,它对应于我想用来访问 a 中的信息的索引(它们始终具有相等的长度)。两个数组都没有a也不数组b已排序。

b = np.array([0, 2, 3, 2, 2, 2])

我想加群a到多个子数组中,这样就可以进行以下操作:

c[0] -> array([18])
c[2] -> array([56, 75, 55, 55])
c[3] -> array([32])

虽然上面的例子很简单,但我将处理数百万个点,因此首选有效的方法。同样重要的是,稍后可以通过自动化方法在程序中以这种方式访问​​任何点子数组。


这是一种方法 -

def groupby(a, b):
    # Get argsort indices, to be used to sort a and b in the next steps
    sidx = b.argsort(kind='mergesort')
    a_sorted = a[sidx]
    b_sorted = b[sidx]

    # Get the group limit indices (start, stop of groups)
    cut_idx = np.flatnonzero(np.r_[True,b_sorted[1:] != b_sorted[:-1],True])

    # Split input array with those start, stop ones
    out = [a_sorted[i:j] for i,j in zip(cut_idx[:-1],cut_idx[1:])]
    return out

一种更简单但效率较低的方法是使用np.split替换最后几行并获取输出,如下所示 -

out = np.split(a_sorted, np.flatnonzero(b_sorted[1:] != b_sorted[:-1])+1 )

样本运行 -

In [38]: a
Out[38]: array([18, 56, 32, 75, 55, 55])

In [39]: b
Out[39]: array([0, 2, 3, 2, 2, 2])

In [40]: groupby(a, b)
Out[40]: [array([18]), array([56, 75, 55, 55]), array([32])]

获取覆盖整个 ID 范围的子数组b -

def groupby_perID(a, b):
    # Get argsort indices, to be used to sort a and b in the next steps
    sidx = b.argsort(kind='mergesort')
    a_sorted = a[sidx]
    b_sorted = b[sidx]

    # Get the group limit indices (start, stop of groups)
    cut_idx = np.flatnonzero(np.r_[True,b_sorted[1:] != b_sorted[:-1],True])

    # Create cut indices for all unique IDs in b
    n = b_sorted[-1]+2
    cut_idxe = np.full(n, cut_idx[-1], dtype=int)

    insert_idx = b_sorted[cut_idx[:-1]]
    cut_idxe[insert_idx] = cut_idx[:-1]
    cut_idxe = np.minimum.accumulate(cut_idxe[::-1])[::-1]

    # Split input array with those start, stop ones
    out = [a_sorted[i:j] for i,j in zip(cut_idxe[:-1],cut_idxe[1:])]
    return out

样本运行 -

In [241]: a
Out[241]: array([18, 56, 32, 75, 55, 55])

In [242]: b
Out[242]: array([0, 2, 3, 2, 2, 2])

In [243]: groupby_perID(a, b)
Out[243]: [array([18]), array([], dtype=int64), 
           array([56, 75, 55, 55]), array([32])]
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用值数组将 numpy 分组为多个子数组 的相关文章

随机推荐

  • 在为 ASP.NET MVC 2.0 应用程序注册区域时提供或过滤程序集

    我有一个大型应用程序 目前作为 WebForms 和 MVC 2 0 的混合体存在 我的应用程序的启动非常糟糕 罪魁祸首主要是因为AreaRegistration RegisterAllAreas称呼 更具体地说 它正在使用System W
  • 使用纯 Javascript 的自定义工具提示的基本思想

    我需要使用 pure 创建自定义工具提示的基本想法Javascript code 我想要的是 例如 a href Link Text a And onmouseover我想显示自定义工具提示fixed position基于 a 的元素pos
  • WP7 - 在列表框中添加/删除项目的动画

    我知道您可以在 Silverlight 4 中通过使用 ListBoxItem 样式的 LayoutStates 即 BeforeUnloaded BeforeLoaded 和 AfterLoaded 来实现此目的 尽管这些状态以默认样式存
  • 导入 Dart 库时使用“show”除了意图和编译器速度之外还有其他好处吗?

    说我有 import dart async show Timer import dart math show Random 我认为一个好处是你可以明确地设定你的意图 所以以后如果你尝试使用其他东西 你必须明确决定你是否真的愿意 我认为另一个
  • 是否可以在 PopupMenu 中显示图标?

    我真的很喜欢 3 0 中的新 PopupMenu 但我无法在其中的菜单项旁边显示任何图标 我正在从下面的 xml 中扩充菜单
  • 将结构复制到 C 中的结构

    我想将相同的结构复制到另一个结构中 然后将其用作与第一个结构的比较 问题是 当我这样做时 我的编译器会给我一个警告 我应该以另一种方式做还是我做错了 在头文件中 extern struct RTCclk uint8 t second uin
  • React Router browserHistory.push 在新选项卡中打开链接

    可以使用 as 在新选项卡中打开链接 但是否可以使用browserHistory push在新选项卡中打开链接 React router 是基于浏览器 History API 构建的 browserHistory push calls pu
  • 渲染启动更新的操作

    我有一个设置控制器用行动account and profile 还有一个update看起来像 def update player current user if player update attributes params player
  • javascript 动态更改表单 onsubmit

    我有一个带有一些操作和 onsubmit 值的表单 它是通过提交输入标记提交的 问题是它应该可以通过两个按钮提交 因此我为第二个按钮编写了一个函数来更改表单的 action 和 onsubmit 值 a href class submit
  • Objective-C中为什么要在头文件中定义实例变量

    我可以理解在头文件的 interface中定义函数 但为什么是实例变量呢 实例变量不应该是私有的 只能通过消息访问吗 原因是它可以计算子类变量的偏移量 interface Bird NSObject int wingspan end int
  • Java GC:为什么有两个幸存者空间[重复]

    这个问题在这里已经有答案了 在网上的大多数教程中 我们可以看到他们显示GC中有两个幸存者空间 当我们实际上只能拥有一个幸存者空间时 为什么需要拥有两个呢 拥有两个幸存者空间对性能有何影响 原因是 你猜对了 性能 首先让我解释一下为什么幸存者
  • 如何获取 SQL Server 查询返回的一组多行中的 n 个最常见的单词?

    我想从 SQL Server 中的查询返回 10 个最常见的单词 因此针对一组行运行 如下所示 快速棕色狐狸缓慢的黄狐缓慢的绿狐 会回来 fox slow quick brown yellow green 我会尝试在每个返回的行上运行分割函
  • 这些 Xcode 4 调试器图标意味着什么?

    我一直没能找到这些 Xcode 图标的含义 有些你可以推断出来 杯子图标是可可 人物图标是你的代码 但其他的则更神秘 更新1 我能够在以下位置找到图标文件 Xcode app Contents PlugIns DebuggerFoundat
  • Rails:NameError(未初始化的常量UserSerializer)

    我目前正在使用 Rails 6 0 构建一个仅包含 Rails API 的应用程序 我在用fast jsonapi对于 JSON Ruby 对象的 API 序列化 目前我只创建了UsersController 我有一个user模型具有以下属
  • Android 应用内结算的官方国家/地区列表? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 您好 我目前在巴基斯坦 当我启动 Google 示例应用内结算应用程序时 它说 无法购买 市场 计费服务不可用 这次 您可以继续使用 这个应用程序
  • 如何配置 Devise for Ruby on Rails 将电子邮件和密码存储在用户模型之外的其他位置?

    我想将电子邮件存储在单独的表中 并允许用户保存多封电子邮件并使用其中任何电子邮件登录 我还想将密码存储在不同的表中 如何配置 Devise 将身份验证信息存储在其他地方 最坏的情况是 如果我必须侵入它 是否有一个生成器可以将所有内容移植到应
  • 锁定自定义选项卡的方向

    我想使用 Chrome 自定义选项卡锁定方向 这是我可以使用低级 API 完成的事情还是我需要为此功能添加新方法 我的用例是 我有一个具有自定义选项卡的应用程序 我希望它始终以纵向显示自定义选项卡 而不是横向显示 自定义选项卡当前不提供允许
  • 从设置中获取动态属性

    我的 AppConfig 中存储了一些属性 现在我想动态访问它们 例如在循环或函数中 使用 MySettings NAME OF THAT THING 访问值没有问题 但如果名称是变量怎么办 I tried String propertyV
  • 如何沿 axis=1 进行 DataFrame.groupby

    I have df pd DataFrame A 1 2 3 B 1 2 6 df A B 0 1 1 1 2 2 2 3 6 问 我如何获得 A 0 1 1 2 2 1 5 using groupby and aggregate 就像是
  • 使用值数组将 numpy 分组为多个子数组

    我有一系列沿直线的点 a np array 18 56 32 75 55 55 我有另一个数组 它对应于我想用来访问 a 中的信息的索引 它们始终具有相等的长度 两个数组都没有a也不数组b已排序 b np array 0 2 3 2 2 2