Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.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
Python 查找多维数组pyhton行中最大、第二大或第三大的索引_Python_Arrays_Python 3.x_Numpy - Fatal编程技术网

Python 查找多维数组pyhton行中最大、第二大或第三大的索引

Python 查找多维数组pyhton行中最大、第二大或第三大的索引,python,arrays,python-3.x,numpy,Python,Arrays,Python 3.x,Numpy,假设我有以下两个numpy阵列: a = numpy.array([[1,4,6,2,5],[3,2,7,12,1],[8,5,3,1,4],[6,10,2,4,9]]) b = numpy.array([0, 1, 4]) 现在,我想首先搜索特定行中最大值的索引(只需说第二行a[1,:]),我有另一个数组b,其中包含一些数字,如果最大值的索引作为另一个b中的元素出现,我将使用该索引数字进行更多的计算。如果a行中的最大值索引没有作为b中的元素出现,我需要查找第二大数字的索引,如果该索引值作为元

假设我有以下两个numpy阵列:

a = numpy.array([[1,4,6,2,5],[3,2,7,12,1],[8,5,3,1,4],[6,10,2,4,9]])
b = numpy.array([0, 1, 4])
现在,我想首先搜索特定行中最大值的索引(只需说第二行
a[1,:]
),我有另一个数组
b
,其中包含一些数字,如果最大值的索引作为另一个
b
中的元素出现,我将使用该索引数字进行更多的计算。如果
a
行中的最大值索引没有作为
b
中的元素出现,我需要查找第二大数字的索引,如果该索引值作为元素出现在
b
中,我会查找第三大数字的索引,依此类推。我不想对数组
a
进行排序


在上面的例子中,我在第二行有
[3,2,7,12,1]
。最大数的索引是3,但b中不存在3,然后第二大数的索引是2,b中也不存在,然后我查找第三大数的索引,即0,b中存在。然后我给一个新变量赋值0。有什么快速的方法吗?提前谢谢

IIUC,如果需要从
a
保留索引:

res = b[a[:, b].argmax(1)]

array([4, 0, 0, 1])
或者:

a[:, np.delete(np.arange(a.shape[1]), b)] = a.min()
res = a.argmax(1)

array([4, 0, 0, 1], dtype=int64)
如果屏蔽数组的索引足够:

res = a[:, b].argmax(1)

array([2, 0, 0, 1], dtype=int64)

IIUC,如果需要从
a
保留索引:

res = b[a[:, b].argmax(1)]

array([4, 0, 0, 1])
或者:

a[:, np.delete(np.arange(a.shape[1]), b)] = a.min()
res = a.argmax(1)

array([4, 0, 0, 1], dtype=int64)
如果屏蔽数组的索引足够:

res = a[:, b].argmax(1)

array([2, 0, 0, 1], dtype=int64)

这里有一个可以很好地扩展到通用ndarrays-

def maxindex(a, b, fillna=-1):
    sidx = a.argsort(-1)
    m = np.isin(sidx,b)
    idx = m.shape[-1] - m[...,::-1].argmax(-1) - 1
    out = np.take_along_axis(sidx,idx[...,None],axis=-1).squeeze()
    return np.where(m.any(-1), out, fillna)
样本运行-

In [83]: a
Out[83]: 
array([[ 1,  4,  6,  2,  5],
       [ 3,  2,  7, 12,  1],
       [ 8,  5,  3,  1,  4],
       [ 6, 10,  2,  4,  9]])

In [84]: b
Out[84]: array([0, 1, 4])

In [85]: maxindex(a, b) # all rows
Out[85]: array([4, 0, 0, 1])

In [86]: maxindex(a[1], b) # second row
Out[86]: array([0])
三维案例-

In [105]: a
Out[105]: 
array([[[ 1,  4,  6,  2,  5],
        [ 3,  2,  7, 12,  1],
        [ 8,  5,  3,  1,  4],
        [ 6, 10,  2,  4,  9]],

       [[ 1,  4,  6,  2,  5],
        [ 3,  2,  7, 12,  1],
        [ 8,  5,  3,  1,  4],
        [ 6, 10,  2,  4,  9]]])

In [106]: maxindex(a, b)
Out[106]: 
array([[4, 0, 0, 1],
       [4, 0, 0, 1]])

这里有一个可以很好地扩展到通用ndarrays-

def maxindex(a, b, fillna=-1):
    sidx = a.argsort(-1)
    m = np.isin(sidx,b)
    idx = m.shape[-1] - m[...,::-1].argmax(-1) - 1
    out = np.take_along_axis(sidx,idx[...,None],axis=-1).squeeze()
    return np.where(m.any(-1), out, fillna)
样本运行-

In [83]: a
Out[83]: 
array([[ 1,  4,  6,  2,  5],
       [ 3,  2,  7, 12,  1],
       [ 8,  5,  3,  1,  4],
       [ 6, 10,  2,  4,  9]])

In [84]: b
Out[84]: array([0, 1, 4])

In [85]: maxindex(a, b) # all rows
Out[85]: array([4, 0, 0, 1])

In [86]: maxindex(a[1], b) # second row
Out[86]: array([0])
三维案例-

In [105]: a
Out[105]: 
array([[[ 1,  4,  6,  2,  5],
        [ 3,  2,  7, 12,  1],
        [ 8,  5,  3,  1,  4],
        [ 6, 10,  2,  4,  9]],

       [[ 1,  4,  6,  2,  5],
        [ 3,  2,  7, 12,  1],
        [ 8,  5,  3,  1,  4],
        [ 6, 10,  2,  4,  9]]])

In [106]: maxindex(a, b)
Out[106]: 
array([[4, 0, 0, 1],
       [4, 0, 0, 1]])

你希望你的例子有什么输出?你希望你的例子有什么输出?@user3483203,啊,好吧,我已经更新了,我想我现在明白OP的意思了。@user3483203,啊,好吧,我已经更新了,我想我现在明白OP的意思了。嗨,迪瓦卡,我无法测试你的代码,因为我得到了下面的错误。模块“numpy”没有“沿_轴取_”属性。虽然我把numpy作为np导入。有什么想法吗?@HT121这是NumPy图书馆的新添加。你能更新一下你的NumPy吗?我明天会查的。应该是可能的。我无法升级numpy。但是我确信如果我有更新的版本,我应该有期望的输出。谢谢你。我也试着获得正确的输出。我使用以下代码设法让它工作:
I=np.argsort(a[1,:])[:-1]
c=[x为x为I,如果x为b]
print('intersection is',c[0])
@HT121同时,您只需从shape\u base import take\u沿\u轴下载并使用-
导入即可。这是一个独立的文件。嗨,Divakar,我不能测试你的代码,因为我得到了以下错误。模块“numpy”没有“沿_轴取_”属性。虽然我把numpy作为np导入。有什么想法吗?@HT121这是NumPy图书馆的新添加。你能更新一下你的NumPy吗?我明天会查的。应该是可能的。我无法升级numpy。但是我确信如果我有更新的版本,我应该有期望的输出。谢谢你。我也试着获得正确的输出。我使用以下代码设法让它工作:
I=np.argsort(a[1,:])[:-1]
c=[x为x为I,如果x为b]
print('intersection is',c[0])
@HT121同时,您只需从shape\u base import take\u沿\u轴下载并使用-
导入即可。这是一个独立的文件。