【问题标题】:3D list indexing- how to get max(z) for a specific x,y3D 列表索引 - 如何获取特定 x,y 的 max(z)
【发布时间】:2014-10-04 02:10:12
【问题描述】:

我有一个带有 3D 索引的列表,对于每个组合 (x,y,z) 我都有一个值。我想知道是否有办法获得特定 x,y 的最大 z。

例子:

 a=defaultdict(list)
 ...
 a = {(0,0,1): 5, (0,0,2): 1, (0,0,3): 4}

如何获得 (x=0,y=0) 的 max(z)(应该是 3)?

我需要使用这种数据结构,因为我有一个未知 z 的动态 3 维矩阵(Z 上的异构数据)。

【问题讨论】:

    标签: python list matrix 3d indexing


    【解决方案1】:

    怎么样: max(b[2] for b in a.keys() if b[0] == 0 and b[1] == 0)

    这使用生成器表达式返回 x 和 y 为 0 的值的 z 坐标。

    【讨论】:

    • 实际上您可以通过在 a.keys() if b[0] == 0 and b[1] == 0] 中编写 max([b[2] for b in a.keys() if b[0] == 0 and b[1] == 0]) 来省略 lambda 部分
    • 解决方案的计算量很大。我有大量数据要处理,每次我都必须遍历 3D 索引以检查特定组合的存在。有没有更快的方法来解决问题?到目前为止,我花了 20 多分钟来处理 10% 的数据……pfiou!!
    • 这个你有很多数据,那我就用numpy。您可以使用max(b[2] for b in a.keys() if b[0] == 0 and b[1] == 0) 提高速度
    • @Nras - 好点。那么整个事情就可以是一个生成器表达式。
    • @PeterCollingridge Ty.
    【解决方案2】:

    如果您需要对 x 和 y 的所有可能组合进行此操作,我建议您应该重新排序数据,使得 x 和 y 的元组是键,而对应的 z 是值。然后你可以简单地找到最大 z:

    from collections import defaultdict
    a = {(0,0,1): 5, (0,0,2): 1, (0,0,3): 4, (1,0,2): 5}
    b = defaultdict(list)
    for xyz in a:
        xy = xyz[:-1]
        z = xyz[-1]
        b[xy].append(z)
    
    max(b[(0,0)])
    

    【讨论】:

      【解决方案3】:

      如果您可以访问numpy,这可能会容易得多:

      >>> import numpy as np
      >>> a = np.arange(1, 9).reshape((2, 2, 2))
      >>> a
      array([[[1, 2],
              [3, 4]],
      
             [[5, 6],
              [7, 8]]])
      >>> a[0, 0].max()
      2
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-12
        • 2011-04-28
        • 2017-08-12
        • 1970-01-01
        • 2017-11-18
        • 2013-06-17
        • 2018-01-24
        • 1970-01-01
        相关资源
        最近更新 更多