def METHOD_NAME(self) -> NDArrayFloat:
    gram_matrices = [b.gram_matrix() for b in self.basis_list]
    gram = gram_matrices[0]
    for g in gram_matrices[1:]:
        n_rows = len(gram) * len(g)
        gram = np.multiply.outer(gram, g)
        gram = np.moveaxis(gram, [1, 2], [2, 1])
        gram = gram.reshape(n_rows, n_rows)
    return gram