2016-04-19 8 views
1

У меня есть эта матрица 3х3:маски минимальных значений в строках матрицы

a=array([[ 1, 11, 5], 
    [ 3, 9, 9], 
    [ 5, 7, -3]]) 

мне нужно, чтобы замаскировать минимальные значения в каждой строке, чтобы вычислить среднее значение каждой строки отделяемой минимальных значения. Есть ли общее решение? Я попытался с

a_masked=np.ma.masked_where(a==np.ma.min(a,axis=1),a) 

Каких масками минимального значения в первом и третьем ряду, но не вторая строка?

Буду признателен за любую помощь. Благодаря!

ответ

1

Проблема в том, что сравнение a == a.min(axis=1) сравнивает каждый столбец до минимального значения каждой строки, а не сравнивая каждую строку до минимальных значений. Это связано с тем, что a.min(axis=1) возвращает вектор, а не матрицу, которая ведет себя аналогично массиву Nx1. Таким образом, при трансляции оператор == выполняет операцию по-разному, чтобы соответствовать размерам.

a == a.min(axis=1) 

# array([[ True, False, False], 
#  [False, False, False], 
#  [False, False, True]], dtype=bool) 

Одним из возможных способов исправить это resize результат a.min(axis=1) в вектор-столбец (например, 3 х 1 2D массива).

a == np.resize(a.min(axis=1), [a.shape[0],1]) 

# array([[ True, False, False], 
#  [ True, False, False], 
#  [False, False, True]], dtype=bool) 

Или еще проще, как @ColonelBeuvel показал:

a == a.min(axis=1)[:,None] 

Применяя это для всей строки кода.

a_masked = np.ma.masked_where(a == np.resize(a.min(axis=1),[a.shape[0],1]), a) 

# masked_array(data = 
# [[-- 11 5] 
# [-- 9 9] 
# [5 7 --]], 
#  mask = 
#   [[ True False False] 
#   [ True False False] 
#   [False False True]], 
#   fill_value = 999999) 
+0

Спасибо за объяснение! Он работает сейчас, благодаря @Colonel Beauvel, а также –

+0

У меня есть дополнительный вопрос на самом деле. Что делать, если у меня есть строка с двумя или тремя одинаковыми элементами, например: a = array ([[7, 5, 5], [3, 6, 9], [5, 1, 1]]) Как я могу только замаскировать одно из минимального значения, а не все? –

+0

Можете ли вы помочь мне? @ColonelBeuvel –

0

Что такое функция min()?

Для каждой строки просто выполните min (row), и это даст вам минимум этого списка в вашем примере. Просто добавьте этот минимум в список для всех Minimum.

minList = []

for i in array: minList.append(min(i))

+0

Нет, нет, и нет. Для циклов «запрещены» для таких операций. –

+0

Можете ли вы помочь мне в разделе комментариев выше в другом ответе? @ColonelBeuvel –