У меня есть двумерный массив лямбда-функций. Каждая функция имеет 2 аргумента и возвращает число с плавающей запятой.
Как лучше всего передать одни и те же 2 аргумента всем этим функциям и получить массив ответов?
Я пробовал что-то вроде:
np.reshape(np.fromiter((fn(1,2) for fn in np.nditer(J,order='K',flags=["refs_ok"])),dtype = float),J.shape)
для оценки каждой функции в J с аргументами (1,2) (J содержит функции).
Но вроде очень круглые дома, да и не совсем работает ... Есть хороший способ сделать это?
A = J(1,2)
не работает!





Вы можете использовать понимание списков:
A = np.asarray([[f(1,2) for f in row] for row in J])
Это должно работать как для массивов numpy, так и для списка списков.
Я не думаю, что есть действительно чистый способ, но он достаточно чистый и работает:
import operator
import numpy as np
# create array of lambdas
a = np.array([[lambda x, y, i=i, j=j: x**i + y**j for i in range(4)] for j in range(4)])
# apply arguments 2 and 3 to all of them
np.vectorize(operator.methodcaller('__call__', 2, 3))(a)
# array([[ 2, 3, 5, 9],
# [ 4, 5, 7, 11],
# [10, 11, 13, 17],
# [28, 29, 31, 35]])
Альтернативно и немного более гибко:
from types import FunctionType
np.vectorize(FunctionType.__call__)(a, 2, 3)
# array([[ 2, 3, 5, 9],
# [ 4, 5, 7, 11],
# [10, 11, 13, 17],
# [28, 29, 31, 35]])
Здесь vectorize упрощает итерацию по 2d a, но не увеличивает скорость (по сравнению с явным циклом).
Почему это массив? Почему не список (или список списков)? В любом случае это должен быть объектный массив dtype, поэтому вы не можете делать с ним много математических вычислений. И итерация по списку выполняется быстрее.