4

そのような二次元配列があるとしましょう

numpy.array(
    [[0,1,1.2,3],
    [1,5,3.2,4],
    [3,4,2.8,4], 
    [2,6,2.3,5]])

最後の列の値の一意性に基づいて行全体を削除し、3 番目の列の値に基づいて保持する行を選択する配列を作成したいと考えています。たとえば、この場合、最後の列として 4 の行を 1 つだけ保持し、3 番目の列のマイナー値を持つ行を選択して、結果として次のような結果を得たいと考えています。

array([0,1,1.2,3],
      [3,4,2.8,4],
      [2,6,2.3,5])

したがって、行 [1,5,3.2,4] を削除します。

それを行うための最良の方法はどれですか?

4

2 に答える 2

1

私のnumpyは実践的ではありませんが、これはうまくいくはずです:

#keepers is a dictionary of type int: (int, int)
#the key is the row's final value, and the tuple is (row index, row[2])
keepers = {}
deletions = []
for i, row in enumerate(n):
    key = row[3]
    if key not in keepers:
        keepers[key] = (i, row[2])
    else:
        if row[2] > keepers[key][1]:
            deletions.append(i)
        else:
            deletions.append(keepers[key][0])
            keepers[key] = (i, row[2])
o = numpy.delete(n, deletions, axis=0)

非常に扱いにくくなっていた私の宣言型ソリューションから大幅に単純化しました。うまくいけば、これは従うのが簡単です。保持したい値のディクショナリと、削除したいインデックスのリストを維持するだけです。

于 2009-01-22T19:41:26.427 に答える