根据布尔掩码将值从一个numpy矩阵复制到另一个矩阵
这是一个简单的例子,我有以下内容:
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
那么,正确的做法是什么呢?先不考虑我在做一个简单的最大值操作(我猜bumpy可能有内置的工具来处理这个问题)。我真正的问题是,我需要用一组更复杂的布尔值来创建一个布尔掩码,然后用这个掩码去替换一个替换矩阵中的值。
2 个回答
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
3
如果你用数组而不是矩阵来工作,生活会简单很多;这就是这么简单。
>>> 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 ]])
>>>