Соглашаясь с комментарием Dunes :
С небольшими массивами, как в вашем примере, вероятно, проще сделать копию матрицы без данного столбца, а потом взять макс. С большим массивом может быть быстрее взять максимум с любой стороны столбца и взять максимум с левой и правой сторон столбца.
Вот реализация каждого из этих случаев , и функция диспетчера. (Значение для THRESHOLD_SIZE
необходимо добавить на основе экспериментов.)
Малый регистр массива
Создает массив с удаленным указанным столбцом. Вычисляет общий максимум, а затем место его появления. Добавляет единицу к столбцу, если он находится справа.
Корпус большого массива
Создает временные 1d массивы, содержащие максимумы столбца. Обычно (хотя и не во всех случаях) они будут значительно меньше, чем двумерный массив. Сначала определяется, какая сторона исключенного столбца содержит максимум, затем определяется, какой это столбец и, наконец, какая это строка. Это избавляет от необходимости проверять каждый элемент дважды. Код также избегает создания любого двумерного фрагмента массива в любой точке.
THRESHOLD_SIZE = .....
def get_max_position(m, exclude_column):
return (get_max_position_largearray if m.size > THRESHOLD_SIZE
else get_max_position_smallarray)(m, exclude_column)
def get_max_position_smallarray(m, exclude_column):
mnew = np.delete(m, exclude_column, axis=1)
row, col = np.argwhere(mnew == np.max(mnew))[0]
# uses: int(True)=1 and int(False)=0
return (row, col + (col >= exclude_column))
def get_max_position_largearray(m, exclude_column):
column_maxima = np.max(m, axis=0)
l_col_maxima = column_maxima[:exclude_column]
r_col_maxima = column_maxima[exclude_column + 1:]
l_max = np.max(l_col_maxima) if l_col_maxima.size else None
r_max = np.max(r_col_maxima) if r_col_maxima.size else None
use_left = (True if r_max == None else
False if l_max == None else
(l_max > r_max))
if use_left:
themax = l_max
col = np.argwhere(l_col_maxima == themax)[0][0]
else:
themax = r_max
col = exclude_column + 1 + np.argwhere(r_col_maxima == themax)[0][0]
row = np.argwhere(m[:,col] == themax)[0][0]
return (row, col)
Вот пример в вопросе обоими методами:
m = np.array([[1,10,3],
[4,15,6]])
exclude_column = 1
print(get_max_position_largearray(m, exclude_column))
print(get_max_position_smallarray(m, exclude_column))
Вывод:
(1, 2)
(1, 2)