Python 查找多维数组pyhton行中最大、第二大或第三大的索引
假设我有以下两个numpy阵列: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中的元素出现,我需要查找第二大数字的索引,如果该索引值作为元
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轴下载并使用-导入即可。这是一个独立的文件。