【发布时间】:2021-02-15 04:38:00
【问题描述】:
我创建了一个 numpy 数组,其中所有单元格的值都是对象。我想使用 np.where 条件,但它不起作用,因为我想检查对象属性的等效条件。对象类如下所示:
class Cell():
def __init__(self):
self.value = 'ABC'
def __repr__(self):
return self.value
现在我有 2D numpy 数组,其中所有单元格都与这个单元格类等效,我想检查 cell.value == 'ABC'。 numpy 数组看起来像,
array([[M, M, M, M],
[M, 'ABC', M, M],
[M, M, M, M],
[M, M, M, 'ABC'],
[M, M, M, M]], dtype=object)
如果我尝试运行 np.where(temp == 'ABC'),我会得到以下输出:
(array([], dtype=int64), array([], dtype=int64))
如果我运行命令 np.where(temp.value == 'ABC'),我会收到以下错误:
AttributeError Traceback (most recent call last)
<ipython-input-70-073cbaaed538> in <module>
----> 1 np.where(temp.value =='ABC')
AttributeError: 'numpy.ndarray' object has no attribute 'value'
如何将 np.where 与 OOP 结合使用?
【问题讨论】:
-
请提供minimal reproducible example 以显示哪些代码的行为不符合您的预期,以及具体出了什么问题。
-
np.where(cond)只是在cond中查找True/False(技术上非零)值。所以它的作用完全取决于arg==value表达式产生的结果。在您有一组Cell对象时,arr.value不起作用。这样的对象数组与列表相比几乎没有(如果有的话)优势。 -
只是为了让您知道,
numpy实际上并不是针对处理对象 dtypes 的情况而设计的。如果可能,您应该避免在代码中使用对象 dtype,即使只是切换到使用内置类型进行处理。现在,您可以使用结构化 dtypes 而不是对象,这取决于您想从类中获得什么 -
您正在将
str类型与<class '__main__.Cell'>类型进行比较。只需使用arr.astype(str)更改类型并与np.where进行比较。详情请查看我的回答。