将值从一个numpy矩阵复制到另一个依赖于布尔掩码的numpy矩阵

时间:2014-03-07 16:23:18

标签: python numpy matrix replace

作为一个简单的例子,我有以下内容:

import numpy as np
a = np.matrix([[0.34, 0.44, 0.21, 0.51]])
a_max = np.matrix([[0.35, 0.40, 0.20, 0.50]])

我想应用一个转换,其中a大于a_max的任何内容的上限为a_max。我试图通过以下方式做到这一点:

a[a>a_max] = a_max[a>a_max]

然而这会引发错误:

ValueError: array is not broadcastable to correct shape

这样做的正确方法是什么?忽略我正在做一个简单的最大值的事实(我猜崎岖不平可能有内置工具来解决这个特定问题)。我的真正问题是使用一组更复杂的布尔值来创建一个布尔掩码,然后应该替换替换矩阵中的值。

2 个答案:

答案 0 :(得分:3)

如果使用数组而不是矩阵,生活会更容易;它只是工作(tm)。

>>> a = np.array([[0.34, 0.44, 0.21, 0.51]])
>>> a_max = np.array([[0.35, 0.40, 0.20, 0.50]])
>>> a[a > a_max] = a_max[a > a_max]
>>> a
array([[ 0.34,  0.4 ,  0.2 ,  0.5 ]])

我猜你可以使用np.where,但是:

>>> a = np.matrix([[0.34, 0.44, 0.21, 0.51]])
>>> a_max = np.matrix([[0.35, 0.40, 0.20, 0.50]])
>>> np.where(a > a_max, a_max, a)
matrix([[ 0.34,  0.4 ,  0.2 ,  0.5 ]])
>>> 

答案 1 :(得分:0)

minimum函数似乎就足够了:

a = np.matrix([[999, 0.1, 0.1, 999]])
a_max = np.matrix([[1, 2, 3, 4]])
a_capped = np.minimum(a, a_max)

print repr(a_capped)  # the printed result of matrix.__str__ is weird to me

打印:

matrix([[1. , 0.1, 0.1, 4. ]])

http://docs.scipy.org/doc/numpy/reference/generated/numpy.minimum.html