sklearn.compose.ColumnTransformer do not keep transformers` desired dtype of output

Hi,

We are using ColumnTransformer as our unified preprocessor to transform the data. We have the following transformers:

```python
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, OrdinalEncoder, FunctionTransformer



mean_imputer_pipline = Pipeline(steps=[('imputer', SimpleImputer(strategy='mean'))])
constan_one_imputer_pipline = Pipeline(steps=[('imputer', SimpleImputer(strategy='constant', fill_value=1.0))])
constan_zero_imputer_pipline = Pipeline(steps=[('imputer', SimpleImputer(strategy='constant', fill_value=0.0))])

categorical_transformer = Pipeline(steps=[
        ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
        ('onehot', OneHotEncoder(handle_unknown='ignore', dtype=np.int8))])

ordinal_categories = [determine_mapping(ordinal_feature) for ordinal_feature in ordinal_features]

ordinal_transformer = Pipeline(steps=[('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
                                          ('ordinal', OrdinalEncoder(categories=ordinal_categories, dtype=np.int8))])
```

From them we create our ColumnTransformer object:
```python
from sklearn.compose import ColumnTransformer



preprocessor = ColumnTransformer(
        transformers=[
            ('num_mean', mean_imputer_pipline, mean_imputer_features),
            ('num_constant_one', constan_one_imputer_pipline, constant_one_imputer_features),
            ('num_constant_zero', constan_zero_imputer_pipline, constant_zero_imputer_features),
            ('cat', categorical_transformer, categorical_features),
            ('ordinal', ordinal_transformer, ordinal_features)],
        remainder="drop")
```

When we use the ```transform``` method the desired dtypes of output for  ```categorical_transformer``` and ```ordinal_transformer``` that should be ```np.int8``` isn't kept. What we are receiving is numpy's ndarray that its dtype is ```np.float64```.

We debuged the code, and found out that in order to join the outputs from the different transformers the ColumnTransformer is using the method ```np.hstack``` which creates a unified 1 ndarray with one dtype.

Is there a solution?
If not:
1. Please add a warning in the documentation of the ColumnTransformer that the concatenate results won't use the desired dtype of output of the transformers. 
2. Allow us an option to receive the result without concatenation, as a list of ndarrays.

COMMENT:
@thomasjpfan you're right that dtype preserve in that case, here is where the dtype is lost:
```
import numpy as np
import pandas as pd
from sklearn.compose import ColumnTransformer
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import OneHotEncoder
from sklearn.preprocessing import OrdinalEncoder
from sklearn.preprocessing import StandardScaler

ct = ColumnTransformer([
    ("pet_ordinal", OrdinalEncoder(dtype=np.uint16), ["pet"]),
    ("color_ohe", OneHotEncoder(sparse_output=False, dtype=np.uint8), ["color"]),
    ("numerical", StandardScaler(), ["age"]),
    ("imputer", SimpleImputer(strategy='constant', fill_value=1), ["age", "float"]),
    ("imputer2", SimpleImputer(strategy='constant', fill_value=1), ["age"]),
], verbose_feature_names_out=True)
ct.set_output(transform="pandas")

X = pd.DataFrame({"pet": ["dog", "snake", "cat"],
                  "age": [1, 2, 4],
                  "float": [1.5, 2.5, None],
                  "color": ["red", "blue", "orange"]})

X_trans = ct.fit_transform(X)

X.dtype

pet       object
age        int64
float    float64
color     object
dtype: object

X_trans.dtype
pet_ordinal__pet            uint16
color_ohe__color_blue        uint8
color_ohe__color_orange      uint8
color_ohe__color_red         uint8
numerical__age             float64
imputer__age               float64
imputer__float             float64
imputer2__age                int64
dtype: object
```

as you can see `imputer2` preserve the dtype (int64), but when adding the `float' column the dtype is lost.
Is it a bug?
I can see the workaround I can do to preserve the dtype (create transformer for each column) but I don't think this is the right approach

Labels: Documentation, module:compose