代码之家  ›  专栏  ›  技术社区  ›  smatthewenglish

Python输出与元组列表的中值相关联的记录,由numpy确定

  •  2
  • smatthewenglish  · 技术社区  · 7 年前

    我正在使用 numpy

    print(np.median( [x[1] for x in pairs]) )
    

    这个 Pairs collections.namedtuple

    Pair(hash=u'0x034c9e7f28f136188ebb2a2630c26183b3df90c387490159b411cf7326764341', gas=21000)
    Pair(hash=u'0xffda7269775dcd710565c5e0289a2254c195e006f34cafc80c4a3c89f479606e', gas=1000000)
    Pair(hash=u'0x90ca439b7daa648fafee829d145adefa1dc17c064f43db77f573da873b641f19', gas=90000)
    Pair(hash=u'0x7cba9f140ab0b3ec360e0a55c06f75b51c83b2e97662736523c26259a730007f', gas=40000)
    Pair(hash=u'0x92dedff7dab405220c473aefd12e2e41d260d2dff7816c26005f78d92254aba2', gas=21000)
    

    这是我确定中值的方法:

    pairs = list(_as_pairs(dict_hash_gas))
    # pprint.pprint(pairs)
    if pairs:
        # Avoid a ValueError from min() and max() if the list is empty.
        print(min(pairs, key=lambda pair: pair.gas))
        print(max(pairs, key=lambda pair: pair.gas))
        print(np.median( [x[1] for x in pairs]) )
    

    def _as_pairs(pairs):
        for pair in pairs:
            # TODO:  Verify the dict conatains exactly one item?
            for k, v in pair.items():
                # Should the `key` string also be an integer?
                #yield Pair(key=int(k, base=16), value=int(v))
                yield Pair(hash=k, gas=int(v))
    

    here .

    目前,输出如下:

    Pair(hash=u'0xf4f034e23b4118cb4aa4e9d077f0f28d675e25e9dc2650225f32ac33e04c93aa', gas=21000)
    Pair(hash=u'0x92de9056a6357752a46dff1d6ff274d204d450bbd6c51cefe757f199af105cb4', gas=4712388)
    90000.0
    

    Pair ,与中值相关,而不仅仅是中值本身?

    2 回复  |  直到 5 年前
        1
  •  1
  •   mquantin    7 年前

    您可以获得中值对的索引,但它还需要一行:

    len(pairs)%2 == 1

    gases = np.array([pair.gas for pair in pairs])
    medianGasIndex = np.where( gases == np.median(gases) )[0][0]
    print(pairs[medianGasIndex])
    

    2) 如果你有 len(pairs)%2 == 0

    medianGasIndex = np.where( gases == np.percentile(gases,50,interpolation='nearest') )[0][0]
    

    2.2)或同时需要左右中值

    leftMedianGasIndex = np.where( gases == np.percentile(gases,50,interpolation='lower') )[0][0]
    rightMedianGasIndex = np.where( gases == np.percentile(gases,50,interpolation='higher') )[0][0]
    

    它适用于此 minimal working example ,只需根据需要编辑获得中值的方法。

        2
  •  1
  •   norok2    7 年前

    median 值在原始数组中不存在,例如。 np.median([0, 1]) 0.5 .

    pairs 最接近中间带,使用 np.argmin()

    import numpy as np
    
    arr = np.arange(10, 20)
    median_val = np.median(arr)
    print(median_val)
    # output: 14.5
    
    i = np.argmin(np.abs(arr - median_val))
    print(i)
    # output: 4
    print(arr[i])
    # output: 14
    

    对于您的代码,这可能类似于:

    gases_arr = np.array([pair.gas for pair in pairs])
    median_val = np.median(gases_arr)
    i = np.argmin(np.abs(gases_arr - median_gases))
    print(i, pairs[i])
    

    当然,除非您希望仅当 实际上存在于数组中,在这种情况下 pairs[i] == median_val 或者你使用 where