Estoy tratando de convertir el tipo de datos de una lista en flotante. Sé cómo convertir el tipo de datos de cada lista usando for-loop, sin embargo, realmente no sé cómo convertir el tipo de datos de cada elemento de una lista, es decir, tengo una matriz con la cadena de tipo de datos de manera que

array(['5, 0, -150, 0', '6, 0, -10, 0',
       '7, 2.5881904510252, 9.6592582628907, 0',
       '8, 5, 8.6602540378444, 0',
       '9, 7.0710678118655, 7.0710678118655, 0',
       '10, 8.6602540378444, 5, 0'], dtype='<U63')

Entonces, ¿cómo puedo construir una matriz bidimensional como una matriz 6x4 de tipo de datos flotantes?

0
K.S. 30 dic. 2019 a las 11:59

3 respuestas

La mejor respuesta
In [72]: arr = np.array(['5, 0, -150, 0', '6, 0, -10, 0', 
    ...:        '7, 2.5881904510252, 9.6592582628907, 0', 
    ...:        '8, 5, 8.6602540378444, 0', 
    ...:        '9, 7.0710678118655, 7.0710678118655, 0', 
    ...:        '10, 8.6602540378444, 5, 0'], dtype='<U63')                     

La comprensión de la lista que proponen los demás es la correcta, pero se puede simplificar:

In [73]: [line.split(',') for line in arr]                                      
Out[73]: 
[['5', ' 0', ' -150', ' 0'],
 ['6', ' 0', ' -10', ' 0'],
 ['7', ' 2.5881904510252', ' 9.6592582628907', ' 0'],
 ['8', ' 5', ' 8.6602540378444', ' 0'],
 ['9', ' 7.0710678118655', ' 7.0710678118655', ' 0'],
 ['10', ' 8.6602540378444', ' 5', ' 0']]

np.array puede encargarse de manejar las listas anidadas y la conversión a flotante:

In [74]: np.array(_, dtype=float)                                                     
Out[74]: 
array([[   5.        ,    0.        , -150.        ,    0.        ],
       [   6.        ,    0.        ,  -10.        ,    0.        ],
       [   7.        ,    2.58819045,    9.65925826,    0.        ],
       [   8.        ,    5.        ,    8.66025404,    0.        ],
       [   9.        ,    7.07106781,    7.07106781,    0.        ],
       [  10.        ,    8.66025404,    5.        ,    0.        ]])

El hecho de que el objeto original sea una matriz en lugar de una lista no mejora esta conversión. De hecho, iterar en la matriz es más lento que iterar en la lista equivalente.

0
hpaulj 30 dic. 2019 a las 17:31

Itere en esa matriz, divida esas cadenas en el delimitador, luego hágalas del tipo de datos flotante.

>>> arr2 = np.array([np.array([float(i.strip()) for i in j.split(',') if i]) for j in arr1])
>>> arr2
array([[   5.        ,    0.        , -150.        ,    0.        ],
       [   6.        ,    0.        ,  -10.        ,    0.        ],
       [   7.        ,    2.58819045,    9.65925826,    0.        ],
       [   8.        ,    5.        ,    8.66025404,    0.        ],
       [   9.        ,    7.07106781,    7.07106781,    0.        ],
       [  10.        ,    8.66025404,    5.        ,    0.        ]])
>>> arr2.dtype
dtype('float64')
3
TJC World 30 dic. 2019 a las 09:08

Usando list:

li = ['5, 0, -150, 0', '6, 0, -10, 0',
       '7, 2.5881904510252, 9.6592582628907, 0',
       '8, 5, 8.6602540378444, 0',
       '9, 7.0710678118655, 7.0710678118655, 0',
       '10, 8.6602540378444, 5, 0']

result = []

for i in li:
    row = []
    for j in i.split(','):
        row.append(float(j.strip()))
    result.append(row)

print(result)

Salida:

[[5.0, 0.0, -150.0, 0.0], [6.0, 0.0, -10.0, 0.0], [7.0, 2.5881904510252, 9.6592582628907, 0.0], [8.0, 5.0, 8.6602540378444, 0.0], [9.0, 7.0710678118655, 7.0710678118655, 0.0], [10.0, 8.6602540378444, 5.0, 0.0]]

O usando la comprensión de la lista

result = [[float(j.strip()) for j in i.split(',') if j] for i in li]

Entonces puedes construir una matriz numpy usando el resultado:

numpy.array(result, dtype='<U63')

O

numpy.array([[float(j.strip()) for j in i.split(',') if j] for i in li], dtype='<U63')
0
abhiarora 30 dic. 2019 a las 09:18