【问题标题】:How to find the minimum indices and break ties by the least used indices in Python?如何在 Python 中通过最少使用的索引找到最小索引并打破关系?
【发布时间】:2018-11-05 21:03:11
【问题描述】:

我有一个如下的 numpy 数组:

A = np.array([[1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 5, 1, 1, 1],
              [1, 1, 1, 1, 3, 3, 1, 1],
              [1, 1, 1, 1, 1, 1, 2, 1],
              [1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 1, 4, 1, 1]])

我正在寻找每列中的最小索引。我发现这个使用numpy.argmin 如下:

I = np.zeros(A.shape[1], dtype=np.int64)
for j in range(A.shape[1]):
    I[j] = np.argmin(A[:, j])

这给了我I = [0, 0, 0, 0, 0, 0, 0, 0]。由于存在联系,我可以获得以下信息:I = [0, 1, 2, 3, 4, 0, 5, 1],我通过最少使用的索引(来自以前的索引)来打破联系。

更多细节:

  • 对于j=0,我们有np.argmin(A[:, 0]) in [0, 1, 2, 3, 4, 5],比如说,我们选择np.argmin(A[:, 0]) = 0
  • 对于j=1,我们有np.argmin(A[:, 1]) in [0, 1, 2, 3, 4, 5],我们必须从[1, 2, 3, 4, 5] 中选择最小索引,因为这些索引使用最少(我们已经为j=0 选择了np.argmin(A[:, 0]) = 0)。比如说,我们选择np.argmin(A[:, 1])=1
  • 对于j=2,我们有np.argmin(A[:, 2]) in [0, 1, 2, 3, 4, 5],我们必须从[2, 3, 4, 5] 中选择最小索引,因为这些索引使用最少。
  • 我们就这样继续下去……
  • 对于j=5,我们有np.argmin(A[:, 5]) in [0, 1, 3, 4],我们必须从[0, 1, 3, 4] 中选择最小索引,因为这些索引使用最少。假设我们选择np.argmin(A[:, 5])=0
  • 对于j=6,我们有np.argmin(A[:, 6]) in [0, 1, 2, 4, 5],我们必须从[5] 中进行选择,因为这些索引使用最少。我们选择np.argmin(A[:, 6])=5
  • 对于j=7,我们有np.argmin(A[:, 7]) in [0, 1, 2, 3, 4, 5],我们必须从[1, 2, 3, 4, 5] 中进行选择,因为这些索引使用最少。假设我们选择np.argmin(A[:, 7])=1

我希望它很清楚。我的问题是如何通过 Python 中最少使用的索引找到最小索引并打破关系?

【问题讨论】:

  • 我不理解你所说的“最小”或“最少使用”索引的意思。最小索引不是总是为0吗?其余的索引不都和未使用的一样吗?
  • 最小索引可以是 0 或 1 等,因为我们在矩阵中有联系。第一次(第一列),所有索引都未使用。因此,第一列的最小索引可以是任何未使用的索引。
  • Python 索引以 0 开头...我错过了什么?您是否正在超载“索引”?你的例子是做你想做的还是不做你想做的?如果您的示例符合您的要求,您是否正在尝试提高效率?

标签: python numpy


【解决方案1】:

您可以使用min 结合字典来保存每个索引的计数:

import numpy as np

A = np.array([[1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 5, 1, 1, 1],
              [1, 1, 1, 1, 3, 3, 1, 1],
              [1, 1, 1, 1, 1, 1, 2, 1],
              [1, 1, 1, 1, 1, 1, 1, 1],
              [1, 1, 1, 1, 1, 4, 1, 1]])

counts = {}
I = np.zeros(A.shape[1], dtype=np.int64)
for j in range(A.shape[1]):
    _, _, i = min([(v, counts.get(i, 0), i) for i, v in enumerate(A[:, j])])
    counts[i] = counts.get(i, 0) + 1
    I[j] = i

print(I)

输出

[0 1 2 3 4 0 5 1]

想法是创建如下key:(value, count of index, index),然后使用元组的正常比较,所以如果值相等,将选择相应索引的计数较少的那个,如果两个计数相等则得到将选择索引较低的那个。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-30
    • 2020-09-12
    • 2018-08-12
    • 1970-01-01
    • 2023-03-03
    • 2018-04-03
    • 1970-01-01
    • 2015-01-13
    相关资源
    最近更新 更多