我想使用广播来使用一个数组(较低维度)中的值来屏蔽另一个数组(更高维度).
一个例子是
a= np.arange(9).reshape(3,3)
b= np.arange(3)
Run Code Online (Sandbox Code Playgroud)
我试过的是
c=np.ma.masked_where(b[:,np.newaxis]>1, a)
Run Code Online (Sandbox Code Playgroud)
但它失败了" 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]
Run Code Online (Sandbox Code Playgroud)
并在masked_where
声明中使用它
c=np.ma.masked_where(d>1,a)
Run Code Online (Sandbox Code Playgroud)
但这违背了通过使用避免临时数组的范例np.newaxis
.
OBTW,使用where命令允许以这种方式进行广播
c=np.where(b[:,np.newaxis]>1, 0.0, a)
Run Code Online (Sandbox Code Playgroud)
按预期工作.
此外,如果该条件中的条件masked_where
始终为false,则命令将执行而不会出现错误...
c=np.ma.masked_where(b[:,np.newaxis]>5, 0.0, a)
Run Code Online (Sandbox Code Playgroud)
会屈服a
.
FWIW,我正在使用numpy 1.6.1.