Подтвердить что ты не робот

Матричное умножение в pandas

У меня есть числовые данные, хранящиеся в двух DataFrames x и y. Внутренний продукт из numpy работает, но точечный продукт от pandas не работает.

In [63]: x.shape
Out[63]: (1062, 36)

In [64]: y.shape
Out[64]: (36, 36)

In [65]: np.inner(x, y).shape
Out[65]: (1062L, 36L)

In [66]: x.dot(y)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-66-76c015be254b> in <module>()
----> 1 x.dot(y)

C:\Programs\WinPython-64bit-2.7.3.3\python-2.7.3.amd64\lib\site-packages\pandas\core\frame.pyc in dot(self, other)
    888             if (len(common) > len(self.columns) or
    889                     len(common) > len(other.index)):
--> 890                 raise ValueError('matrices are not aligned')
    891 
    892             left = self.reindex(columns=common, copy=False)

ValueError: matrices are not aligned

Является ли это ошибкой или неправильно использую pandas?

4b9b3361

Ответ 1

Не только должны быть правильные формы x и y, но также имена столбцов x должны совпадать с именами индекса y. В противном случае этот код в pandas/core/frame.py вызовет значение ValueError:

if isinstance(other, (Series, DataFrame)):
    common = self.columns.union(other.index)
    if (len(common) > len(self.columns) or
        len(common) > len(other.index)):
        raise ValueError('matrices are not aligned')

Если вы просто хотите вычислить матричный продукт, не указав имена столбцов x в именах индексов y, затем используйте функцию NumPy dot:

np.dot(x, y)

Причина, по которой имена столбцов x должны совпадать с именами индексов y, заключается в том, что метод pandas dot будет переиндексировать x и y, чтобы, если порядок столбцов x и порядок индекса y, естественно, не совпадают, они будут сопоставлены перед выполнением матричного продукта:

left = self.reindex(columns=common, copy=False)
right = other.reindex(index=common, copy=False)

Функция NumPy dot не делает этого. Он просто вычислит матричный продукт на основе значений в базовых массивах.


Вот пример, который воспроизводит ошибку:

import pandas as pd
import numpy as np

columns = ['col{}'.format(i) for i in range(36)]
x = pd.DataFrame(np.random.random((1062, 36)), columns=columns)
y = pd.DataFrame(np.random.random((36, 36)))

print(np.dot(x, y).shape)
# (1062, 36)

print(x.dot(y).shape)
# ValueError: matrices are not aligned