在numpy中找到最大值,跳过一些行和列

时间:2016-11-03 14:36:36

标签: python numpy matrix

我想在numpy矩阵中找到最大行和列索引。但它不在一组行或列中。因此,它应该在计算最大值时跳过这些行和列。

示例:

# finding max in numpy matrix 
[row,col] = np.where(mat == mat.max())

但它应该跳过行removed_rows = []和列columns_rows = []

我不想为计算创建新的子矩阵。

2 个答案:

答案 0 :(得分:3)

a成为输入数组,rows_remcols_rem分别是要跳过的行和列索引。我们会有一种使用掩蔽的方法,就像这样 -

m,n = a.shape
d0,d1 = np.ogrid[:m,:n]
a_masked = a*~(np.in1d(d0,rows_rem)[:,None] | np.in1d(d1,cols_rem))
max_row, max_col = np.where(a_masked == a_masked.max())

示例运行 -

In [204]: # Inputs
     ...: a = np.random.randint(11,99,(4,5))
     ...: rows_rem = [1,3]
     ...: cols_rem = [1,2,4]
     ...: 

In [205]: a
Out[205]: 
array([[36, 51, 72, 18, 31],
       [78, 42, 12, 71, 72],
       [38, 46, 42, 67, 12],
       [87, 56, 76, 14, 21]])

In [206]: a_masked
Out[206]: 
array([[64,  0,  0, 90,  0],
       [ 0,  0,  0,  0,  0],
       [17,  0,  0, 40,  0],
       [ 0,  0,  0,  0,  0]])

In [207]: max_row, max_col
Out[207]: (array([0]), array([3]))

请注意,如果有多个元素具有相同的最大值,我们将在输出中包含所有这些元素。所以,如果你想要任何或第一个,我们可以使用argmax,就像这样 -

max_row, max_col = np.unravel_index(a_masked.argmax(),a.shape)

答案 1 :(得分:0)

remove_rows = [2,3]
remove_cols = [0,1]

a = np.random.randint(11,99,(4,5))

>>> a
array([[60, 86, 89, 66, 20],
       [77, 86, 78, 90, 44],
       [68, 57, 83, 48, 25],
       [30, 81, 42, 11, 63]])
>>>

通过过滤掉要删除的索引来获取您感兴趣的行索引和列索引:

r, c = a.shape
r = [x for x in range(r) if x not in remove_rows]
c = [x for x in range(c) if x not in remove_cols]

>>> r,c
([0, 1], [2, 3, 4])
>>>

现在rc可用于integer indexingnumpy.ix_有助于此。

>>> a[np.ix_(r,c)]
array([[89, 66, 20],
       [78, 90, 44]])
>>>

在ndarray.max()上获取最大值:

>>> a[np.ix_(r,c)].max()
90
>>>

最后,使用numpy.where查找原始数组中的位置:

>>> row, col = np.where(a == a[np.ix_(r,c)].max())
>>> row, col
(array([1]), array([3]))
>>>

如果删除非顺序行或列,此方法也可以使用。 例如:

remove_rows = [0,3]
remove_cols = [1,4]