根据布尔掩码将值从一个numpy矩阵复制到另一个矩阵

1 投票
2 回答
1028 浏览
提问于 2025-04-17 21:19

这是一个简单的例子,我有以下内容:

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 ]])
>>> 

撰写回答