【问题标题】:Matches of array indexs Python数组索引的匹配 Python
【发布时间】:2014-01-29 21:24:45
【问题描述】:

我有一个 n 行的多维数组 q 和另一个 n 行的多维数组 q2。这些数组包含相同的行,但顺序不同。如何获得 2 个数组的匹配列表/数组?示例如下:

q=array([a,b,c,d],  #row 1
        [e,f,g,h],  #row 2
        [i,l,m,n])  #row 3

q2=array([e,f,g,h], #row 2
         [a,b,c,d], #row 1
         [i,l,m,n]) #row 3

q_index=[1,2,3]
q2_index=? #I know is [2,1,3] but I can I get it?

我需要创建索引的 q 列表/数组和相关的索引 q2 列表/数组列表。 谢谢

【问题讨论】:

  • 请同时发布预期的输出。
  • 我需要 q2_index 列表/数组 ty @AshwiniChaudhary
  • 什么是a、b、c...?数字、字符串?
  • 浮点数@thf435
  • 所以澄清一下,q2_index 应该是 [2,1,3]?

标签: python arrays list indexing


【解决方案1】:

先将q转换为字典,先将item转换为元组作为键使用,索引作为值使用。

>>> q = [['a','b','c','d'], ['e','f','g','h'], ['i','l','m','n']]
>>> q2 = [['e','f','g','h'], ['a','b','c','d'], ['i','l','m','n']]
>>> q_dict = {tuple(x):i for i, x in enumerate(q, 1)}
>>> [q_dict[tuple(item)] for item in q2]
[2, 1, 3]

【讨论】:

  • 如果 OP 实际上需要 q_index 可能与 [1..n] 不同,这将不起作用。然而,他对此并不完全清楚......
  • @user3250719 你能发布确切的回溯吗?请注意,您的帖子中有错字,m,m 重复了两次。我在发布之前修复了这个问题。
  • KeyError Traceback (最近一次调用最后一次) in () ----> 1 [q_dict[tuple(item)] for item in q2]
  • @user3250719 请完整回溯,KeyError 还会返回引发错误的键。
  • KeyError: (2.0, 254.0, 0.007874015748031496, 6.0)
【解决方案2】:

您可以使用此代码,但请注意它具有二次运行时。鉴于您当前的数据结构,多项式是我们将得到的最好的。对于小的ns,首先将其转换为不同的数据结构可能效率不高。这将取决于n 的大小是否更快或使用哈希表。鉴于数组中的值是浮动的,您必须特别小心:

def compFloatLists(l1, l2, epsilon=0.0001):
    if len(l1) != len(l2):
        return False
    for e1, e2 in zip(l1, l2):
        if abs(e1-e2) > epsilon:
            return False
    return True

q2_index = []
for e1 in q2:
    for i, e2 in enumerate(q1):
        if compFloatLists(e1, e2):
            q2_index.append(q_index[i])
            break

作为不相关的附注:您可能希望将 q_index 重命名为 q_indices,这使您的代码更容易理解恕我直言。

【讨论】:

  • 我之前不需要打印 q1_indices 吗?如何?谢谢
  • 为什么要打印它们?在此代码中,您的目标是获取q2_indices。我当然假设 q_indices 是在运行此代码之前定义的。
  • 对不起,我不是那个意思。我还需要创建 q_index 列表
  • 在 q2_index 我只有 [1,2]
  • 很奇怪,它对我有用。在这种情况下,我们将需要您的用例中更详细的示例来正确解决问题。但我会先睡个好觉;)
猜你喜欢
  • 2021-02-08
  • 2018-06-28
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 2021-08-31
  • 2013-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多