Ответ 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