Анализ результатов использования dir() в массиве Numpy

#python #arrays #numpy

#python #массивы #numpy

Вопрос:

У меня есть массив numpy a.

Когда я использую dir () в массиве numpy следующим образом:

 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() отсутствует. Почему?

Комментарии:

1. Не могли бы вы подробнее остановиться на 1.

2. Поскольку ndarray создается на основе скомпилированного кода, различие между атрибутом и методом не совсем такое четкое, как если бы вы написали класс на put Python. Также многие атрибуты являются properites, или подобными свойствам, что означает, что их использование фактически вызывает метод.

3. Зачем вам это нужно. Все общедоступные задокументированы: numpy.org/doc/stable/reference/generated/numpy.ndarray.html . __... Те, которые обычно не используются непосредственно пользователями. Python преобразует вызов len(x) в x.__len__() , приводит к вызову __add__ или ‘ iadd ‘ и т.д.

4. itpython Инструмент завершения (вкладка) выводит список всех этих элементов (‘__’ отдельно) и добавляет () к методам.

5. Я изучаю numpy, поэтому подумал, что было бы неплохо получить все атрибуты и методы, связанные с массивом numpy.

Ответ №1:

В списке есть метод 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))
]
  

Комментарии:

1. Если я выполняю vars(), я получаю следующую ошибку: «аргумент vars() должен иметь атрибут __ dict __»

2. Выше приведен рецепт получения атрибутов и методов из объектов. Однако я не понял нюанса объектов numpy, на который указал @hpaulj, поэтому я бы согласился с их ответом.