Python 两个数组之间的数组索引

Python 两个数组之间的数组索引,python,numpy,Python,Numpy,我有一个numpy数组和相应的查找值。从每一列数据中,我应该得到相应查找的最大位置,并将该位置转换为数据结果 我必须按图中所示去做 图片比我的语言更能说明问题 import numpy as np data = np.array([[0, 2, 1, 4, 3, 2, 4, 4, 1], [1, 1, 2, 0, 3, 4, 4, 2, 1], [2, 2, 1, 4, 4, 1, 4, 4, 4]] ) print (da

我有一个numpy数组和相应的查找值。从每一列数据中,我应该得到相应查找的最大位置,并将该位置转换为数据结果

我必须按图中所示去做

图片比我的语言更能说明问题

import numpy as np

data = np.array([[0, 2, 1, 4, 3, 2, 4, 4, 1],
                 [1, 1, 2, 0, 3, 4, 4, 2, 1],
                 [2, 2, 1, 4, 4, 1, 4, 4, 4]] )

print (data)

print ()

lookup = np.array([[60, 90, 90, 60, 50],
                  [90, 90, 80, 90, 90],
                  [60, 40, 90, 60, 50]])

print (lookup)

print ()
我做了如下工作:

data = data.transpose(1,0)

lookup = lookup.transpose(1,0)

results = []       
for d in data:   
   matches = lookup[d].diagonal()
   print (matches)
   idx = np.argmax(matches, axis=0)
   res = d[idx]
   results.append(res)

print ()

print (results)  
成功了。
但是,还有更好的方法吗?

我不确定我是否理解你,但也许这就是你想要的

data = data.T
lookup = lookup.T
cols = np.zeros_like(data) + np.array([0, 1, 2])
idx = np.argmax(lookup[data, cols], axis=1)
data[np.arange(data.shape[0]), idx]

您可以使用展平事实:

l = lookup.shape[1]
data1 = (data + [[0],[l], [2*l]]).copy()
matches = lookup.flatten()[data1.flatten()].reshape(data1.shape).T
results = data.T[:, np.argmax(matches, axis = 1)].diagonal()
print(matches)
print(results)
输出

使用。使用它,您可以提供索引数组。见示例:

数据=np.arange20 数据[[0,1,5,10]]数组[0,1,5,10] 用于索引的数组也会广播。见示例:

数据=np.arange20.5,4 i=np.array[0,4] j=np.数组[0,3] 数据[i,j]数组[0,19] i、 j=i[:,np.newaxis],j[np.newaxis,:] 数据[i,j]数组[[0,3],[16,19]] 在您的例子中,匹配是这样的:匹配[i,j]=lookup[i,data[i,j]]。 使用花式索引,我们可以:

i=np.arangedata.shape[-2][:,np.newaxis] 匹配=查找[i,数据] 最后的结果应该是结果[j]=data[i_max[j],其中i_max[j]=argmax_imatches[i,j],其转换为:

i_max = np.argmax(matches, axis=-2)
j = np.arange(data.shape[-1])
result = data[i_max, j]

你能用文字而不是图片来描述你想做的事情吗?添加到问题中。你找到了匹配项。那么,如何获得结果?[1,2,1,0,3,2,4,2,1]获取生成的匹配项的argmax并将其转换为数据值。预期结果是[1,2,1,0,3,2,4,2,1]为什么+np。数组[0,1,2]?这只是一种懒惰的方法,可以生成类似[[0,1,2],[0,1,2],[0,1,2],…]的内容,即每行的列。也许更好的方法是使用np.ndgrid.lookup[data,cols]是您的匹配项
i_max = np.argmax(matches, axis=-2)
j = np.arange(data.shape[-1])
result = data[i_max, j]