<p><code>numpy.ufunc</code>当给定一个object dtype数组时,遍历该数组,并尝试对每个元素应用一个协同响应方法。在</p>
<p>例如,<code>np.abs</code>尝试应用<code>__abs__</code>方法。让我们将这样一个方法添加到类中:</p>
<pre><code>In [31]: class ExampleObject():
...:
...: def __init__(self, r):
...: self.r = r
...: def __abs__(self):
...: return self.r
...:
</code></pre>
<p>现在创建阵列:</p>
^{pr2}$
<p>并从列表中生成一个object dtype数组:</p>
^{3}$
<p>现在我们可以通过调用<code>np.abs</code>函数来获得<code>r</code>值的数组:</p>
<pre><code>In [35]: np.abs(exampleArr)
Out[35]:
array([0.28411876298913485, 0.5807617042932764, 0.30566195995294954,
0.39564156171554554, 0.28951905026871105, 0.5500945908978057,
0.40908712567465855, 0.6469497088949425, 0.7480045751535003,
0.710425181488751], dtype=object)
</code></pre>
<p>它还可以处理数组的索引元素:</p>
<pre><code>In [36]: np.abs(exampleArr[:3])
Out[36]:
array([0.28411876298913485, 0.5807617042932764, 0.30566195995294954],
dtype=object)
</code></pre>
<p>这很方便,但我不能保证速度。在其他测试中,我发现对象数据类型上的迭代比数值数组元素上的迭代(在Python中)快,但比列表迭代慢。在</p>
<pre><code>In [37]: timeit np.abs(exampleArr)
3.61 µs ± 131 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
In [38]: timeit [h.r for h in exampleList]
985 ns ± 31.5 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [39]: timeit np.array([h.r for h in exampleList])
3.55 µs ± 88.6 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
</code></pre>