如何在Python中找到最少索引并按最少使用索引打破联系?

时间:2018-11-05 21:03:12

标签: python numpy

我有一个如下的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]中选择最小索引,因为这些索引使用最少(我们已经为{{ 1}})。假设我们选择np.argmin(A[:, 0]) = 0
  • 对于j=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]

我希望这很清楚。我的问题是如何在Python中找到最少的索引并按最少使用的索引打破联系?

1 个答案:

答案 0 :(得分: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]

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