У меня есть фреймворк Pandas с двумя столбцами, каждый из которых содержит разреженный вектор SciPy в каждой строке. Эти векторы представляют собой строки из матриц csr (так что на самом деле они являются матрицами формы 1x8500).
Мне нужно создать еще один столбец, который должен содержать в каждой из своих строк скалярный продукт между векторами из первых двух столбцов той же строки.
Я знаю, как это сделать с apply
/ map
в каждой строке, но это занимает так много времени, когда я работаю с наборами данных с миллионами строк. Есть ли более быстрый способ сделать это для всего фрейма данных?
Помимо скалярного произведения мне также нужно будет вычислить косинусное сходство, но, насколько я понимаю, это может быть получено из скалярных произведений.
Обновление: я не могу поделиться фактическими данными здесь, но вот игрушечный пример (обратите внимание, что на данный момент у меня есть только итоговый фрейм данных):
import pandas as pd
import numpy as np
from scipy.sparse import csr_matrix
row = np.array([0, 0, 1, 2, 2, 2])
col = np.array([0, 2, 2, 0, 1, 2])
data = np.array([1, 2, 3, 4, 5, 6])
mat = csr_matrix((data, (row, col)), shape=(3, 3))
df = pd.DataFrame({'Col_1': [mat.getrow(i) for i in range(3)],
'Col_2': [mat.getrow(i)*2 for i in range(3)]})
Я знаю, что могу сделать что-то вроде этого для вычисления скалярного произведения:
df['Col_3'] = df.apply(lambda row: np.dot(row['Col_1'],
row['Col_2'].transpose()).toarray()[0][0], axis=1)
Но есть ли более эффективный способ вычислить это Col_3
?
apply
иnp.dot
на этих структурах заставляет меня ждать десятки минут. - person Sergey Zakharov   schedule 29.05.2017csr
матрицами и хорошо знаком с пандами. разреженные кадры данных / серии. Продемонстрируйте, как вы создаете свой фрейм данных (на небольшом примере я могу копировать и вставлять). Мне нужно более четкое представление о том, что означает, что столбец содержит разреженную матрицу. - person hpaulj   schedule 29.05.2017dot
продукт имеет смысл. В этом случае вы повторяете строки и делаетеA[i]*B[i].T
(илиnp.dot(A[i],B[i].T)
) - person hpaulj   schedule 29.05.2017print(df.dtypes)
иprint(type(df.iloc[0,0]))
? - person MaxU   schedule 30.05.2017df['Col_3'] = df['Col_1'].values.dot(df['Col_2'].values)
- person MaxU   schedule 30.05.2017ValueError: dimension mismatch
- person Sergey Zakharov   schedule 30.05.2017print(df.dtypes)
object
для обоих столбцов. Результат дляprint(type(df.iloc[0,0]))
-<class 'scipy.sparse.csr.csr_matrix'>
. - person Sergey Zakharov   schedule 30.05.2017