Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numpy数组上的条件操作_Python_Arrays_Numpy_Conditional - Fatal编程技术网

Python numpy数组上的条件操作

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 "&

我是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 "<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