Conversion d'un tableau NumPy en structure de liste Python?

298

Comment puis-je convertir un tableau NumPy en une liste Python (par exemple [[1,2,3],[4,5,6]]) et le faire assez rapidement?

Alex Brooks
la source

Réponses:

427

Utilisation tolist():

import numpy as np
>>> np.array([[1,2,3],[4,5,6]]).tolist()
[[1, 2, 3], [4, 5, 6]]

Notez que cela convertit les valeurs de n'importe quel type numpy qu'ils peuvent avoir (par exemple np.int32 ou np.float32) en "type Python compatible le plus proche" (dans une liste). Si vous souhaitez conserver les types de données numpy, vous pouvez appeler list () sur votre tableau à la place, et vous vous retrouverez avec une liste de scalaires numpy . (Merci à Mr_and_Mrs_D de l'avoir signalé dans un commentaire.)

Peter Hansen
la source
6
Si votre liste est float32 la tolistconvertira en floatss - ce n'est probablement pas souhaité. L'utilisation list(myarray)n'en souffre pas - pourquoi devrions-nous préférer tolist?
Mr_and_Mrs_D
1
@Mr_and_Mrs_D suggérez-vous que, malgré la présence de flottants dans votre tableau, vous aimeriez que la liste résultante soit des entiers? C'est en quelque sorte une toute autre question ... et bien sûr, vous devez spécifier que, bien qu'il s'agisse de valeurs float32, elles seront toutes intégrales. Quoi qu'il en soit, si vous aviez cette situation, je suppose que faire myarray.astype(np.int32).tolist()serait une option, et explicite sur ce que vous essayez d'accomplir. (Et enfin, list(array_of_type_float32)ne donne pas d'entiers ici quand je l'ai essayé ... donc je ne sais pas ce que vous demandez.)
Peter Hansen
1
Je n'ai jamais mentionné d'entiers - essayezfloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D
2
D'accord, donc l'un convertit en [float] et l'autre utilise toujours le type scalaire numpy float32, comme [np.float32]. Bien. Bon à savoir, mais je suppose que cela est souhaitable ou non dépend de chaque cas spécifique. Pour ce que ça vaut, je soupçonne qu'en général, quand quelqu'un (comme l'OP) demande une conversion en liste, ils signifient implicitement une liste de types de données Python réguliers, dans ce cas, soit des flottants ou des entiers, et pas une liste de types scalaires numpy . Merci de l'avoir signalé: j'ai modifié la réponse pour inclure une note à ce sujet.
Peter Hansen
Dans ce sens: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
keithpjolley
11

La méthode numpy .tolist produit des listes imbriquées si la forme du tableau numpy est 2D.

si des listes plates sont souhaitées, la méthode ci-dessous fonctionne.

import numpy as np
from itertools import chain

a = [1,2,3,4,5,6,7,8,9]
print type(a), len(a), a
npa = np.asarray(a)
print type(npa), npa.shape, "\n", npa
npa = npa.reshape((3, 3))
print type(npa), npa.shape, "\n", npa
a = list(chain.from_iterable(npa))
print type(a), len(a), a`
aspiringGuru
la source
5

tolist()fonctionne bien même en cas de rencontre avec un tableau imbriqué, par exemple un pandas DataFrame;

my_list = [0,1,2,3,4,5,4,3,2,1,0]
my_dt = pd.DataFrame(my_list)
new_list = [i[0] for i in my_dt.values.tolist()]

print(type(my_list),type(my_dt),type(new_list))
Shivid
la source
0

someList = [list(map(int, input().split())) for i in range(N)]

Ganesh Jadhav
la source
0

c = np.array ([[1,2,3], [4,5,6]])

list(c.flatten())
Harshal SG
la source