首页 > 解决方案 > 分析在 Numpy 数组上使用 dir() 的结果

问题描述

我有一个 numpy 数组 a。

当我在 numpy 数组上使用 dir() 时,如下所示:

dir(a)

我得到以下列表:

 '__abs__',
 '__add__',
 '__and__',
 '__array__',
 '__array_finalize__',
 '__array_function__',
 '__array_interface__',
 '__array_prepare__',
 '__array_priority__',
 '__array_struct__',
 '__array_ufunc__',
 '__array_wrap__',
 '__bool__',
 '__class__',
 '__complex__',
 '__contains__',
 '__copy__',
 '__deepcopy__',
 '__delattr__',
 '__delitem__',
 '__dir__',
 '__divmod__',
 '__doc__',
 '__eq__',
 '__float__',
 '__floordiv__',
 '__format__',
 '__ge__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__iadd__',
 '__iand__',
 '__ifloordiv__',
 '__ilshift__',
 '__imatmul__',
 '__imod__',
 '__imul__',
 '__index__',
 '__init__',
 '__init_subclass__',
 '__int__',
 '__invert__',
 '__ior__',
 '__ipow__',
 '__irshift__',
 '__isub__',
 '__iter__',
 '__itruediv__',
 '__ixor__',
 '__le__',
 '__len__',
 '__lshift__',
 '__lt__',
 '__matmul__',
 '__mod__',
 '__mul__',
 '__ne__',
 '__neg__',
 '__new__',
 '__or__',
 '__pos__',
 '__pow__',
 '__radd__',
 '__rand__',
 '__rdivmod__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__rfloordiv__',
 '__rlshift__',
 '__rmatmul__',
 '__rmod__',
 '__rmul__',
 '__ror__',
 '__rpow__',
 '__rrshift__',
 '__rshift__',
 '__rsub__',
 '__rtruediv__',
 '__rxor__',
 '__setattr__',
 '__setitem__',
 '__setstate__',
 '__sizeof__',
 '__str__',
 '__sub__',
 '__subclasshook__',
 '__truediv__',
 '__xor__',
 'all',
 'any',
 'argmax',
 'argmin',
 'argpartition',
 'argsort',
 'astype',
 'base',
 'byteswap',
 'choose',
 'clip',
 'compress',
 'conj',
 'conjugate',
 'copy',
 'ctypes',
 'cumprod',
 'cumsum',
 'data',
 'diagonal',
 'dot',
 'dtype',
 'dump',
 'dumps',
 'fill',
 'flags',
 'flat',
 'flatten',
 'getfield',
 'imag',
 'item',
 'itemset',
 'itemsize',
 'max',
 'mean',
 'min',
 'nbytes',
 'ndim',
 'newbyteorder',
 'nonzero',
 'partition',
 'prod',
 'ptp',
 'put',
 'ravel',
 'real',
 'repeat',
 'reshape',
 'resize',
 'round',
 'searchsorted',
 'setfield',
 'setflags',
 'shape',
 'size',
 'sort',
 'squeeze',
 'std',
 'strides',
 'sum',
 'swapaxes',
 'take',
 'tobytes',
 'tofile',
 'tolist',
 'tostring',
 'trace',
 'transpose',
 'var',
 'view']

现在,我有两个问题:

  1. 有没有办法自动将上面列表中的属性和方法分开?我的意思是有一种方法可以只输出 numpy 数组的方法列表或属性。

  2. 列表中有 dunder 方法 __ len __ 但作为 dir(a) 的结果输出的列表中没有 len()。为什么?

标签: pythonarraysnumpy

解决方案


列表中有 dunder 方法 __ len __ 但作为 dir(a) 的结果输出的列表中没有 len()。为什么?

__len__()实现len()

有没有办法自动将上面列表中的属性和方法分开?我的意思是有一种方法可以只输出 numpy 数组的方法列表或属性。

对于属性,您可以执行vars(a).

对于您可以执行的方法:

methods = [method_name for method_name in dir(a)
                  if callable(getattr(a, method_name))]

在上面的代码片段中,您将通过检查是否可调用来创建表示方法名称的字符串列表object.method_name

如果您想要非 dunder 方法,则可以添加以下修改:

def is_dunder(name):
    if (
        len(name) > 4 and 
        name[:2] == name[-2:] == '__'
    ):
        return True
    else:
        return False

non_dunder_methods = [
    method_name for method_name in a if 
    not is_dunder(method_name) and callable(getattr(a, method_name))
]

推荐阅读