Допустим, у меня есть структурированный массив в numpy, который выглядит следующим образом:
myType = np.dtype([('label', 'U16'), ('value', np.float32), ('max_value', np.float32)])
arr = np.array([ [ ('a', 1., 10.), ('b', 2., 10.) ]
, [ ('c', 3., 10.), ('d', 4., 10.) ]], dtype=myType )
Я могу индексировать каждый атрибут структуры, используя обычный синтаксис скобок, например
>>> arr['value']
array([[1., 2.],
[3., 4.]], dtype=float32)
Предположим, я бы хотел получить соотношение value / max_value
. Этого легко достичь, используя обычную функцию
>>> percentage = lambda arr: arr['value'] / arr['max_value']
>>> percentage(arr)
array([[0.1, 0.2],
[0.3, 0.4]], dtype=float32)
Но это выглядит немного не так с точки зрения пользователя, так как некоторые атрибуты определены в массиве, а другие - как функции. Есть ли способ определить обратный вызов как атрибут? Как показано ниже:
>> arr['percentage'] # Execute the percentage function
array([[0.1, 0.2],
[0.3, 0.4]], dtype=float32)
Причиной использования обратного вызова является сохранение согласованного состояния, поэтому, если вы измените value
, атрибут percentage
сохранит согласованность.