5

配列を検討するa

np.random.seed([3,1415])
a = np.random.randint(0, 10, (10, 2))
a

array([[0, 2],
       [7, 3],
       [8, 7],
       [0, 6],
       [8, 6],
       [0, 2],
       [0, 4],
       [9, 7],
       [3, 2],
       [4, 3]])

累積argmaxを取得するベクトル化された方法は何ですか?

array([[0, 0],  <-- both start off as max position
       [1, 1],  <-- 7 > 0 so 1st col = 1, 3 > 2 2nd col = 1
       [2, 2],  <-- 8 > 7 1st col = 2, 7 > 3 2nd col = 2
       [2, 2],  <-- 0 < 8 1st col stays the same, 6 < 7 2nd col stays the same
       [2, 2],  
       [2, 2],
       [2, 2],
       [7, 2],  <-- 9 is new max of 2nd col, argmax is now 7
       [7, 2],
       [7, 2]])

これは、ベクトル化されていない方法です。

ウィンドウが拡大すると、拡大するウィンドウに argmax が適用されることに注意してください。

pd.DataFrame(a).expanding().apply(np.argmax).astype(int).values

array([[0, 0],
       [1, 1],
       [2, 2],
       [2, 2],
       [2, 2],
       [2, 2],
       [2, 2],
       [7, 2],
       [7, 2],
       [7, 2]])
4

3 に答える 3

1

これを両方の列で簡単にベクトル化する方法は考えられません。ただし、列の数が行の数に比べて少ない場合、それは問題ではなく、その軸には for ループで十分です。

import numpy as np
import numpy_indexed as npi
a = np.random.randint(0, 10, (10))
max = np.maximum.accumulate(a)
idx = npi.indices(a, max)
print(idx)
于 2016-11-18T08:36:35.620 に答える
1

1d 配列の累積 argmax を計算し、それをすべての列に適用する関数を作成したいと思います。これはコードです:

import numpy as np

np.random.seed([3,1415])
a = np.random.randint(0, 10, (10, 2))

def cumargmax(v):
    uargmax = np.frompyfunc(lambda i, j: j if v[j] > v[i] else i, 2, 1)
    return uargmax.accumulate(np.arange(0, len(v)), 0, dtype=np.object).astype(v.dtype)

np.apply_along_axis(cumargmax, 0, a)

NumPy/SciPy? の一般化された累積関数で述べたように、変換してから元に戻す理由np.objectは、Numpy 1.9 の回避策です。

于 2016-11-18T09:03:02.723 に答える