Assigning a row using `DataFrame.loc` sometimes fails to preserve type of data
When assigning a singleton row to a DataFrame with integer type using an `Index` and column, the stored row's `dtype` is sometimes converted to `float64`.

Minimum reproducing example:

```
import pandas as pd
import numpy as np

print(pd.__version__)
print()

df1 = pd.DataFrame({'bar': [0, 1]})  # Initializing with at least one row seems necessary to reproduce
df1.loc[df1.index[:], 'foo'] = np.array([0, 1], dtype=np.int16)
print(df1['foo'])
print()

df2 = pd.DataFrame({'bar': [0]})
df2.loc[df2.index[:], 'foo'] = np.array([0], dtype=np.int16)
print(df2['foo'])
print()
```

Output:
```
1.2.2

0    0
1    1
Name: foo, dtype: int16

0    0.0
Name: foo, dtype: float64
```
