Python numpy数组上的条件操作
我是NumPy新手,在NumPy数组上运行一些条件语句时遇到了问题。假设我有3个numpy阵列,看起来像这样: a: b: 以及,c:Python numpy数组上的条件操作,python,arrays,numpy,conditional,Python,Arrays,Numpy,Conditional,我是NumPy新手,在NumPy数组上运行一些条件语句时遇到了问题。假设我有3个numpy阵列,看起来像这样: a: b: 以及,c: [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] 我有一个关于a和b的条件语句,其中我想使用b的值(如果满足a和b的条件)来计算c的值: c[(a > 3) & (b > 8)]+=b*2 我得到一个错误,说: Traceback (most recent call last): File "&
[[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]]
我有一个关于a和b的条件语句,其中我想使用b的值(如果满足a和b的条件)来计算c的值:
c[(a > 3) & (b > 8)]+=b*2
我得到一个错误,说:
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: non-broadcastable output operand with shape (1,) doesn't match the broadcast shape (3,4)
问题是,您屏蔽了接收部分,但没有屏蔽发送方部分。因此:
c[(a > 3) & (b > 8)]+=b*2
# ^ 1x1 matrix ^3x4 matrix
尺寸不一样。如果您希望执行元素添加(基于您的示例),您也可以简单地将切片添加到右侧零件:
c[(a > 3) & (b > 8)]+=b[(a > 3) & (b > 8)]*2
c[(a>3)和(b>8)]+=b[(a>3)和(b>8)]*2
或者提高效率:
mask = (a > 3) & (b > 8)
c[mask] += b[mask]*2
mask=(a>3)和(b>8)
c[mask]+=b[mask]*2
您可以使用numpy。其中
:
np.where((a > 3) & (b > 8), c + b*2, c)
#array([[ 0, 18, 0, 0],
# [ 0, 0, 0, 0],
# [ 0, 0, 0, 0]])
或者算出:
c + b*2 * ((a > 3) & (b > 8))
#array([[ 0, 18, 0, 0],
# [ 0, 0, 0, 0],
# [ 0, 0, 0, 0]])
numpy表达式中的细微更改将获得所需的结果:
c += ((a > 3) & (b > 8)) * b*2
首先,我用布尔值从
((a>3)和(b>8))
创建一个掩码矩阵,然后将矩阵与b*2
相乘,从而生成一个3x4
矩阵,可以轻松添加到c
谢谢!当每个人都在工作时,投票给他们。我接受了@Psidom for np.where的答案,因为它对我来说最有意义,并且运行时间最快(我的实际脚本将运行这些条件数百万次)
np.where((a > 3) & (b > 8), c + b*2, c)
#array([[ 0, 18, 0, 0],
# [ 0, 0, 0, 0],
# [ 0, 0, 0, 0]])
c + b*2 * ((a > 3) & (b > 8))
#array([[ 0, 18, 0, 0],
# [ 0, 0, 0, 0],
# [ 0, 0, 0, 0]])
c += ((a > 3) & (b > 8)) * b*2