Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Numpy 如何获得矢量化的np.argmax随机分片器?_Numpy - Fatal编程技术网

Numpy 如何获得矢量化的np.argmax随机分片器?

Numpy 如何获得矢量化的np.argmax随机分片器?,numpy,Numpy,我知道我可以通过输入2D数组并指定轴来矢量化np.argmax,例如:np.argmax(2Darray,axis=1)以获得每行的最大索引 我知道如果两个条目在单个1D向量中相等,那么我希望返回最大索引,我可以通过np.random.choice(np.flatnonzero(1Dvector==1Dvector.max())将它们分为三组 问题是,我怎样才能同时做到这两件事?Ie:如何对np.argmax进行矢量化,从而使相等的条目被随机分组?这里有一种方法。对于大数据,可以考虑用更便宜的方

我知道我可以通过输入2D数组并指定轴来矢量化np.argmax,例如:
np.argmax(2Darray,axis=1)
以获得每行的最大索引

我知道如果两个条目在单个1D向量中相等,那么我希望返回最大索引,我可以通过np.random.choice(np.flatnonzero(1Dvector==1Dvector.max())将它们分为三组


问题是,我怎样才能同时做到这两件事?Ie:如何对np.argmax进行矢量化,从而使相等的条目被随机分组?

这里有一种方法。对于大数据,可以考虑用更便宜的方法替换<代码>排列< /代码>。我已经硬编码了axis=1,但这不应该掩盖原理

def fair_argmax_2D(a):
    y, x = np.where((a.T==a.max(1)).T)
    aux = np.random.permutation(len(y))
    xa = np.empty_like(x)
    xa[aux] = x
    return xa[np.maximum.reduceat(aux, np.where(np.diff(y, prepend=-1))[0])]

a = np.random.randint(0,5,(4,5))
a
# array([[2, 2, 2, 2, 1],
#        [3, 3, 3, 3, 2],
#        [3, 4, 2, 1, 4],
#        [3, 2, 4, 2, 1]])

# draw 10000 times
res = np.array([fair_argmax_2D(a) for _ in range(10000)])

# check
np.array([np.bincount(r, None, 5) for r in res.T])
# array([[ 2447,  2567,  2449,  2537,     0],
#        [ 2511,  2465,  2536,  2488,     0],
#        [    0,  5048,     0,     0,  4952],
#        [    0,     0, 10000,     0,     0]])

你检查过了吗:看起来这只适用于一维向量。我找不到np.argwhere的轴参数。另外,我想返回最大值,而不是获取一个最大索引列表,尽管我相信如果np.argwhere可以矢量化,那么这一部分将是微不足道的。非常好的解决方案,谢谢!