It looks like featurenames is a cell in MATLAB. All matrices and cells are 2d in that language. Cells can contain a mix of elements, size and type. That's more like a python list than a numpy numeric array. loadmat returns that as a 2d object dtype array - containing arrays.
You selected featurenames[0:2, 0], which returns 2 of those cell elements as a 1d array.
I can recreate your array with:
In [9]: arr = np.empty(2, dtype=object)
In [11]: arr[:] = [np.array(['Intensity_SubsBlue_Nuclei_1_IntegratedIntensity'],
...: dtype='<U47'),
...: np.array(['Intensity_SubsBlue_Nuclei_2_MeanIntensity'], dtype='<U41')]
...:
...:
In [12]: arr
Out[12]:
array([array(['Intensity_SubsBlue_Nuclei_1_IntegratedIntensity'], dtype='<U47'),
array(['Intensity_SubsBlue_Nuclei_2_MeanIntensity'], dtype='<U41')],
dtype=object)
In [13]: print(arr)
[array(['Intensity_SubsBlue_Nuclei_1_IntegratedIntensity'], dtype='<U47')
array(['Intensity_SubsBlue_Nuclei_2_MeanIntensity'], dtype='<U41')]
So you have to access the elements, and then the element within each of those:
In [14]: arr[0][0]
Out[14]: 'Intensity_SubsBlue_Nuclei_1_IntegratedIntensity'
In [15]: [a.item() for a in arr]
Out[15]:
['Intensity_SubsBlue_Nuclei_1_IntegratedIntensity',
'Intensity_SubsBlue_Nuclei_2_MeanIntensity']
For a single element array, [0] or item() work equally well.
Or the outer elements can be joined into one array with concatenate. Note the change in dtype:
In [16]: np.concatenate(arr)
Out[16]:
array(['Intensity_SubsBlue_Nuclei_1_IntegratedIntensity',
'Intensity_SubsBlue_Nuclei_2_MeanIntensity'], dtype='<U47')
In [17]: _[0]
Out[17]: 'Intensity_SubsBlue_Nuclei_1_IntegratedIntensity'