Un enfoque podría ser utilizar un record array. Las "columnas" no será como las columnas de las matrices numpy estándar, pero para la mayoría de los casos de uso, esto es suficiente:
>>> a = numpy.array(['a', 'b', 'c', 'd', 'e'])
>>> b = numpy.arange(5)
>>> records = numpy.rec.fromarrays((a, b), names=('keys', 'data'))
>>> records
rec.array([('a', 0), ('b', 1), ('c', 2), ('d', 3), ('e', 4)],
dtype=[('keys', '|S1'), ('data', '<i8')])
>>> records['keys']
rec.array(['a', 'b', 'c', 'd', 'e'],
dtype='|S1')
>>> records['data']
array([0, 1, 2, 3, 4])
Tenga en cuenta que también se puede hacer algo similar con un conjunto estándar especificando el tipo de datos de la matriz Esto se conoce como un "structured array":
>>> arr = numpy.array([('a', 0), ('b', 1)],
dtype=([('keys', '|S1'), ('data', 'i8')]))
>>> arr
array([('a', 0), ('b', 1)],
dtype=[('keys', '|S1'), ('data', '<i8')])
La diferencia es que las matrices de registro también permiten atribuir el acceso a los campos de datos individuales. Las matrices estructuradas estándar no.
>>> records.keys
chararray(['a', 'b', 'c', 'd', 'e'],
dtype='|S1')
>>> arr.keys
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'numpy.ndarray' object has no attribute 'keys'
La pregunta es acerca del uso de una matriz NumPy. Sin embargo, si tener una matriz NumPy no es esencial, un [Pandas DataFrame] (http://pandas.pydata.org/pandas-docs/stable/dsintro.html#dataframe) funcionaría bien para esta situación. – crayzeewulf