<p>在阅读了@hpaulj建议的<a href="https://docs.scipy.org/doc/numpy-1.13.0/user/basics.broadcasting.html" rel="nofollow noreferrer">broadcasting</a>之后,我想我知道了函数的工作原理。
它将尝试广播3个数组,然后如果广播成功,它将使用<code>True</code>和<code>False</code>值从x或y中选取元素。
在示例中</p>
<pre><code>>>>np.where([[True, False,True], [False, True]], [[1, 2,56], [3, 4]], [[9, 8,79], [7, 6]])
</code></pre>
<p>我们有</p>
<pre><code>cnd=np.array([[True, False,True], [False, True]])
x=np.array([[1, 2,56], [3, 4]])
y=np.array([[9, 8,79], [7, 6]])
</code></pre>
<p>现在</p>
<pre><code>>>>x.shape
Out[7]: (2,)
>>>y.shape
Out[8]: (2,)
>>>cnd.shape
Out[9]: (2,)
</code></pre>
<p>所以这三个数组都是有2个元素(类型列表)甚至条件(cnd)的数组,所以<code>[True, False,True]</code>和<code>[False, True]</code>都将被计算为<code>True</code>,并且这两个元素都将从x中选择</p>
<pre><code>>>>np.where([[True, False,True], [False, True]], [[1, 2,56], [3, 4]], [[9, 8,79], [7, 6]])
Out[10]: array([list([1, 2, 56]), list([3, 4])], dtype=object)
</code></pre>
<p>我还尝试了一个更复杂的例子(一个<code>2x2x2</code>广播),它仍然解释了这个问题。你知道吗</p>
<pre><code>np.where([[[True,False],[True,True]], [[False,False],[True,False]]],
[[[12,45],[10,50]], [[100,10],[17,81]]],
[[[90,93],[85,13]], [[12,345], [190,56,34]]])
</code></pre>
<p>在哪里</p>
<pre><code>cnd=np.array([[[True,False],[True,True]], [[False,False],[True,False]]])
x=np.array([[[12,45],[10,50]], [[100,10],[17,81]]])
y=np.array( [[[90,93],[85,13]], [[12,345], [190,56,34]]])
</code></pre>
<p>这里<code>cnd</code>和<code>x</code>具有形状<code>(2,2,2)</code>,<code>y</code>具有形状<code>(2,2)</code>。你知道吗</p>
<pre><code>>>>cnd.shape
Out[14]: (2, 2, 2)
>>>x.shape
Out[15]: (2, 2, 2)
>>>y.shape
Out[16]: (2, 2)
</code></pre>
<p>现在@hpaulj评论说<code>y</code>将广播到(2,2,2)。
可能是这样的</p>
<pre><code>>>>cnd
Out[6]:
array([[[ True, False],
[ True, True]],
[[False, False],
[ True, False]]])
>>>x
Out[7]:
array([[[ 12, 45],
[ 10, 50]],
[[100, 10],
[ 17, 81]]])
>>>np.broadcast_to(y,(2,2,2))
Out[8]:
array([[[list([90, 93]), list([85, 13])],
[list([12, 345]), list([190, 56, 34])]],
[[list([90, 93]), list([85, 13])],
[list([12, 345]), list([190, 56, 34])]]], dtype=object)
</code></pre>
<p>结果很容易预测</p>
<pre><code>>>>np.where([[[True,False],[True,True]], [[False,False],[True,False]]], [[[12,45],[10,50]], [[100,10],[17,81]]],[[[90,93],[85,13]], [[12,345], [190,56,34]]])
Out[9]:
array([[[12, list([85, 13])],
[10, 50]],
[[list([90, 93]), list([85, 13])],
[17, list([190, 56, 34])]]], dtype=object)
</code></pre>