【问题标题】:numpy: find all occurences of elements from one table in anothernumpy:从另一个表中查找所有出现的元素
【发布时间】:2013-06-29 10:58:19
【问题描述】:

我在根据给定的翻译表翻译 numpy 数组中的元素时遇到问题。假设我有一个 2D 转换表 trTab,例如

import numpy as np
trTab = np.array([[0, 1, 2, 3 ,4, 5,
                  [5, 2, 3, 1, 0, 4]])

trTab[0, :] 包含所有可能的 id(整数),而trTab[1, :] 将在稍后使用它们的翻译。 trTab 的两行中的 id 都是唯一的。然后我需要翻译框架numpy数组第一列中的所有id,比如

frame = np.array([[0, ...],
                  [3, ...],
                  [5, ...],
                  [1, ...]])

所以它现在等于[[5, ...], [1, ...], [4, ...], [2, ...]],即0->53->15->41->2

frame 可以有不同的行数,实际上我需要翻译很长的帧序列。 frame 第 0 列中的 id 不必按顺序排列,也不必使用所有可能的 id。

是否有任何简单快速的方法可以根据给定的trTab 转换每个这样的帧数组,而不是通过简单循环所有fr[:, 0] 值?如果要处理几千帧,循环会花费太多时间。

【问题讨论】:

    标签: python arrays numpy matrix-indexing


    【解决方案1】:

    如果trTab 第一行和frame 第一列始终是数字,您可以执行以下操作:

    import numpy as np
    from numpy import subtract as s
    fancy_indices = np.absolute(s.outer(frame[:,0],trTab[0,:])).argmin(axis=1)
    frame[:,0] = trTab[1,:][fancy_indices]
    

    【讨论】:

    • 也许我遗漏了一些重要的东西,但为什么不简单地写:frame[:,0] = trTab[1,:][frame[:,0]]?无论哪种方式,我都得到相同的结果,第三行似乎是多余的。
    • 如果您执行frame[:,0]=trTab[1,:]frame 中第一列的新值将按照trTab 中第二行的顺序排列。使用translate 数组的精美索引将在trTab 的第二行中获取正确的元素
    • 您是否包含了我的代码的最后一部分?如果我运行frame= np.array([[0,1,5],[3,2,4],[5,3,3],[1,4,2]]), frame[:,0] = trTab[1,:][frame[:,0]],我会得到一个具有正确顺序的翻译后的第一列。或者也许我只是太密集了。
    • 现在我明白了。在这种情况下,如果frame 中的第一列是从0trTab.shape[1]-1 的数字,它会起作用,但是如果他决定使用数字100,例如,它将引发IndexError跨度>
    • 但是你构建的数组是错误的。 frame 第一列中的所有项目都必须在 trTab 的第一行中......请参阅 OP 的问题
    【解决方案2】:

    为什么不用字典?

    dic={0:5,1:2,2:3,3:1,4:0,5:4}
    frame= np.array([[0,1],[3,2],[5,3],[1,4]])
    frame[:,0]=[dic[x] for x in frame[:,0]]
    

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 1970-01-01
      • 2011-09-11
      • 2012-11-08
      • 2016-09-24
      • 2015-06-09
      • 1970-01-01
      相关资源
      最近更新 更多