【问题标题】:Numpy multiple min indices 3d array [closed]Numpy多个最小索引3d数组[关闭]
【发布时间】:2021-06-29 16:38:13
【问题描述】:

我有一个形状为 (9, 200, 200) 的 numpy 数组。我想获取每个第 0 维行的最小值的索引列表。例如,我的输出将是一个 200 x 200 数组,每个元素都是第 0 维行的最小值的索引列表([0, 2, 3] 等)。我需要解决方案来处理每行的多个最小值,以便每行都有一个包含多个索引的列表。时间是一个因素,所以我更喜欢比基本 python for 循环更快的解决方案。

zero_array = np.random.rand(9, 200, 200)
min_row_values = np.where(zero_array == np.min(zero_array))

上面贴了我当前的解决方案,但是这段代码只显示了整个数组的最小索引值,而不是每一行的最小索引。

【问题讨论】:

  • 你不能有一个参差不齐的数组,所以在你能提供一个具体的minimal reproducible example 显示你认为这是可能的情况之前,请参阅How to Ask
  • 您搜索过问题吗?你得到了什么?
  • 我在 np.where 上找到了一些信息,但我遇到的主要问题是它正在查看整个数组而不是每一行

标签: python numpy indexing


【解决方案1】:

argmin 将为您提供每列中第一个最小元素的索引。 Numpy 通常不支持不规则数组,因此您需要跳过额外的环节才能获得所需的列表。

一个好的开始方法可能是为感兴趣的元素创建一个蒙版:

mask = (x == x.min(axis=0, keepdims=True))

您可以使用np.nonzero 之类的方式将掩码转换为索引。我可能会在部分散开的数组上这样做:

row, col = np.nonzero(mask.reshape(mask.shape[0], -1))

然后,您可以将 rowsplit 用于 col 的唯一值,以便在每列中都有索引数组,排列在一个列表中。不过,您需要先对col 进行排序:

sort_order = col.argsort()
row = row[sort_order]
col = col[sort_order]

一种更聪明(但不太通用)的方法是调用 np.nonzero 并反转维度,以便第一个索引上的自动排序为您处理所有这些:

col, row = np.nonzero(mask.reshape(mask.shape[0], -1).T)

现在实际拆分非常简单:

row = np.split(row, np.flatnonzero(np.diff(col)) + 1)

然后,您可以将生成的索引放置到 dtype=object 的数组中以允许不整齐:

result = np.reshape(row, x.shape[1:])

这种简化的方法会在更新的 numpy 版本中引发警告,因此您可能应该改为执行以下操作:

result = np.empty(x.shape[1:], dtype=object)
result.ravel()[:] = row

【讨论】:

    猜你喜欢
    • 2015-11-12
    • 2021-08-06
    • 1970-01-01
    • 2019-12-23
    • 1970-01-01
    • 2018-02-13
    • 2021-07-31
    • 1970-01-01
    • 2016-03-17
    相关资源
    最近更新 更多