我想使用广播来使用一个数组(较低维度)中的值来屏蔽另一个数组(更高维度)。
一个例子是
a= np.arange(9).reshape(3,3)
b= np.arange(3)
我试过的是
c=np.ma.masked_where(b[:,np.newaxis]>1, a)
但它以“IndexError: Inconsistant[sic] shape between the condition and the input (got(3,1) and (3,3))
”
这是令人困惑的,因为广播应该在这里应用,而b
应该广播到a
。
解决方法是构建正确大小的临时d
数组
d=np.broadcast_arrays(b[:,np.newaxis],a)[0]
并在masked_where
声明
c=np.ma.masked_where(d>1,a)
但这违反了使用np.newaxis
来避免临时数组的范例。
OBTW,使用where命令允许以这种方式进行广播
c=np.where(b[:,np.newaxis]>1, 0.0, a)
按预期工作。
此外,如果masked_where
中的条件始终为false,则命令将无错执行...
c=np.ma.masked_where(b[:,np.newaxis]>5, 0.0, a)
将产生a
。
FWIW,我正在使用numpy 1.6.1。