Как применить функцию ко всем строкам?
Есть класс, в нем первый метод получает на вход два вектора (в виде пандас фреймов или нумпай матриц), хитрым способом обрабатывает их и на выходе выдает кортеж из 2 элементов. Этот метод уже написан.
Второй метод класса получает на вход вектор Y и массив X (не вектор, в нем неизвестное количество столбцов). Этот метод должен вызывать первый метод, давать ему на вход вектор Y и поочередно каждый столбец матрицы X, получать на выходе кортежи из двух элементов и заполнять ими нумпаевскую матрицу (количество строк этой матрицы равно количеству столбцов матрицы X, количество столбцов этой матрицы равно 2, при инициализации я предполагаю заполнить ее np.nan, а затем перезаполнить).
Безусловно реализовать функционал второго метода можно просто через цикл по каждому столбцу массива X. Однако не хотелось бы использовать цикл. Я подумал, может как то это сделать через pandas.apply (предварительно переведя все получаемые на вход объекты в пандас фреймы) или numpy.apply_along_axis, или может другие варианты есть. То есть использовать функционал, который в каждую строку нумпаевской матрицы вписывает нужные значения используя нужный столбец массива Х.
Ответы (1 шт):
Долго пробивался через ваше описание, пытаясь понять, что-же вы хотите. Не уверен что в итоге понял вас правильно, но понял вот так: есть матрица и вектор, и надо над каждым подбъектом (вектором) из X выполнить какую-то функцию, используя Y. Что там в итоге получиться - скаляр, кортеж, или какой иной объект - не важно.
import numpy as np
def myfunc(a, b):
return a*b
vfunc = np.vectorize(myfunc)
X=np.array([[1,2,3],[4,5,6],[7,8,9]]).reshape(-1,3)
Y=np.array([5,6,7])
print ('X \n',X)
print ('Y \n',Y)
print ('X$Y \n',vfunc(X, Y))
Результат:
X
[[1 2 3]
[4 5 6]
[7 8 9]]
Y
[5 6 7]
X$Y
[[ 5 12 21]
[20 30 42]
[35 48 63]]
Тут в X$Y каждый подобъект - результат применения функции myfunc к очередному подобъекту объекта X и вектора Y. Как вы и требовали - от количества подобъектов в X и в Y скрипт не зависит. А вот если формат входных или выходных данных не тот, которые понят после расшифровки вашего описания - надеюсь подправить под ваши потребности сумеете самостоятельно.