Как применить функцию ко всем строкам?

Рейтинг: -3Ответов: 1Опубликовано: 02.03.2023

Есть класс, в нем первый метод получает на вход два вектора (в виде пандас фреймов или нумпай матриц), хитрым способом обрабатывает их и на выходе выдает кортеж из 2 элементов. Этот метод уже написан.

Второй метод класса получает на вход вектор Y и массив X (не вектор, в нем неизвестное количество столбцов). Этот метод должен вызывать первый метод, давать ему на вход вектор Y и поочередно каждый столбец матрицы X, получать на выходе кортежи из двух элементов и заполнять ими нумпаевскую матрицу (количество строк этой матрицы равно количеству столбцов матрицы X, количество столбцов этой матрицы равно 2, при инициализации я предполагаю заполнить ее np.nan, а затем перезаполнить).

Безусловно реализовать функционал второго метода можно просто через цикл по каждому столбцу массива X. Однако не хотелось бы использовать цикл. Я подумал, может как то это сделать через pandas.apply (предварительно переведя все получаемые на вход объекты в пандас фреймы) или numpy.apply_along_axis, или может другие варианты есть. То есть использовать функционал, который в каждую строку нумпаевской матрицы вписывает нужные значения используя нужный столбец массива Х.

Ответы

▲ 0Принят

Долго пробивался через ваше описание, пытаясь понять, что-же вы хотите. Не уверен что в итоге понял вас правильно, но понял вот так: есть матрица и вектор, и надо над каждым подбъектом (вектором) из 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 скрипт не зависит. А вот если формат входных или выходных данных не тот, которые понят после расшифровки вашего описания - надеюсь подправить под ваши потребности сумеете самостоятельно.