屏蔽矩阵行中的最小值

Posted

技术标签:

【中文标题】屏蔽矩阵行中的最小值【英文标题】:Mask minimum values in matrix rows 【发布时间】:2016-08-12 06:09:51 【问题描述】:

我有这个 3x3 矩阵:

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】:

min() 函数有什么作用?

对于每一行,只需执行 min(row),它就会为您的案例中的该列表的最小值提供一行。只需将此最小值附加到所有最小值的列表中即可。

minList=[]

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

【讨论】:

不,不,不。对于此类操作,for 循环是“禁止的”。 你能在上面的 cmets 部分帮助我吗? @ColonelBeuvel【参考方案2】:

问题是因为比较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 x 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)

【讨论】:

感谢您的解释!它现在可以工作了,这也要感谢@Colonel Beauvel 其实我还有一个问题。如果我有一行包含两个或三个相同的元素怎么办,例如:a=array([[ 7, 5, 5], [ 3, 6, 9], [ 5, 1, 1]]) 怎么可能我只屏蔽其中一个最小值而不是全部? 你能帮我吗? @ColonelBeuvel

以上是关于屏蔽矩阵行中的最小值的主要内容,如果未能解决你的问题,请参考以下文章

通过字符串列的最大值和最小值查找数据行中的值是不是相等

从动态数据表中查找行中的最小值

matlab 求出一维矩阵中最小值,且求出该最小值在矩阵中的位置,求各位帮帮忙

按列分组并选择具有多个最小值的行中的所有字段

在 Spark 的 Dataframe 行中查找最小值

使用 Numpy 对矩阵进行最小二乘回归