我想在numpy矩阵中找到最大行和列索引。但它不在一组行或列中。因此,它应该在计算最大值时跳过这些行和列。
示例:
# finding max in numpy matrix
[row,col] = np.where(mat == mat.max())
但它应该跳过行removed_rows = []和列columns_rows = []
我不想为计算创建新的子矩阵。
答案 0 :(得分:3)
让a
成为输入数组,rows_rem
和cols_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])
>>>
现在r
和c
可用于integer indexing,numpy.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]