This could be done faster with
Matrix([self.dot(u) for u in reference_frame])

Since ReferenceFrame __iter__ iterates over the unit vectors directly, we don't need to create a list for them separately