¿Cómo conservar los nombres de columna que comienzan con un signo menos cuando se usa numpy.genfromtxt?

Similar a esta pregunta , numpy.genfromtxt modifica los nombres de mis columnas:

 import numpy as np from io import BytesIO # https://stackoverflow.com/a/11970414/321973 str = 'x,-1,1\n0,1,1\n1,2,3' data = np.genfromtxt(BytesIO(str.encode()), delimiter=',', names=True) print(data.dtype.names) 

cede ('x', '1', '1_1') lugar de lo deseado ('x', '-1', '1') (o incluso mejor, ('x', -1, 1) ). Intenté deletechars="""~!@#$%^&*()=+~\|]}[{';: /?>,<""" Como se sugiere allí, en vano.

El comportamiento que está viendo se debe al hecho de que np.genfromtxt utiliza la clase NameValidator aquí para eliminar automáticamente ciertos caracteres no alfanuméricos de los nombres de los campos.

Es perfectamente legal que un nombre de campo contenga un carácter '-' , por ejemplo:

 x = np.array((1,), dtype=[('-1', 'i')]) print(x['-1']) # 1 

De hecho, dos de los tres nombres de campo modificados que recibe de np.genfromtxt tampoco son “identificadores de Python válidos” ( '1' y '1_1' , ya que comienzan con dígitos).

Por lo tanto, es posible construir la matriz que describe siempre y cuando np.genfromtxt uso de np.genfromtxt para establecer los nombres de los campos. Una forma de hacerlo sería inicializar una matriz vacía, especificar los nombres de campo y los tipos explícitamente, luego rellenarlos con el rest del contenido de la cadena:

 names = str.splitlines()[0].split(',') types = ('i',) * 3 dtype = zip(names, types) data = np.empty(2, dtype=dtype) data[:] = np.genfromtxt(BytesIO(str.encode()), delimiter=',', dtype=dtype, skiprows=1) print(repr(data)) # array([(0, 0, 1), (1, 0, 2)], # dtype=[('x', ' 

Sin embargo, solo porque puede no significar que debería, puede haber otras consecuencias impredecibles por tener un '-' en uno de sus nombres de campo. La opción más segura es seguir usando solo identificadores de Python válidos como nombres de campo.