У меня есть несколько функций внутри класса, которые я применил к массиву изображений numpy. Я хотел бы знать, как пройти через все из них и применить их. Например:
Class Augmentation():
def rotation(data):
return rotated_image
def shear(data):
return sheared_image
def elasticity(data):
return enlarged_image
A=Augmentation()
Мой конечный результат должен состоять из всех моих функций. Так, например: мои данные (64,64) в форме. Итак, после всех моих дополнений у меня должно быть окончательное число (12,64,64). В настоящее время я пытался создавать разные функции, а затем использовал
stack_of_images = np.stack(f1,f2,f3,....,f12)
stack_of_images.shape = (12,64,64)
Я использую 12 различных функций для увеличения массивов изображений numpy. Я вставляю 1 изображение (64,64) и получаю 12 изображений (12,64,64).
[f(data) for f in [list,of,functions]]
@JohnGordon Да, данные одинаковы для всех функций, данные являются исходным набором данных, а остальные функции, например: вращение на 90 градусов, сдвиг, вращение на 45 градусов и т. д.
Напишите тринадцатую функцию-оболочку, которая вызывает двенадцать других функций и возвращает их результаты в виде списка.
Вы можете сделать это, обратившись к словарю атрибутов типа.
Вы можете получить его с помощью vars(Augmentation)
или Augmentation.__dict__
. Затем просто просмотрите словарь и проверьте функции с помощью callable
.
ПРИМЕЧАНИЕ: запрос vars(A)
или A.__dict__
(обратите внимание, что это экземпляр, а не класс) НЕ будет включать ничего, определенного в классе, и в этом случае будет просто {}
. Вам даже не нужно создавать экземпляр в первую очередь.
ПРИМЕЧАНИЕ 2: кажется, что вместо этого вы должны пометить все методы декоратором @staticmethod
. В противном случае вызов любого метода экземпляра, например A.shear()
, вместо этого будет передавать A
как data
, что, скорее всего, нежелательно.
class foo:
@staticmethod
def bar(data):
...
Пример:
methods = []
for attrname,attrvalue in vars(Augmentation).items():
if callable(attrvalue):
methods.append(attrvalue)
print([i.__name__ for i in methods])
Обратите внимание, что vars()
дает вам только пространство имен этого одного класса, который не включает атрибуты каких-либо родительских классов. Используйте dir()
(и отфильтруйте имена, начинающиеся с подчеркивания), чтобы получить имена общедоступных атрибутов из всей иерархии классов.
@MartijnPieters Хороший вопрос. Кроме того, если вы действительно хотите заново изобрести колесо, вы можете выполнить итерацию Augmentation.mro()
и добавить функции из каждого родительского класса вручную. И вам все еще нужно отфильтровать методы __xxx__
. Очевидно, не делайте этого, если вам не нужны определенные действия для каждого базового класса.
Является ли входная переменная
data
одинаковой для всех двенадцати функций?