Преобразование массива NumPy в структуру списка Python?


297

Как мне преобразовать массив NumPy в список Python (например [[1,2,3],[4,5,6]]) и сделать это достаточно быстро?

Ответы:


426

Используйте tolist():

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

Обратите внимание, что это преобразует значения из любого типа numpy, который они могут иметь (например, np.int32 или np.float32), в «ближайший совместимый тип Python» (в списке). Если вы хотите сохранить numy-типы данных, вы можете вместо этого вызвать list () в вашем массиве, и вы получите список numy-скаляров . (Спасибо Mr_and_Mrs_D за указание на это в комментарии.)


6
Если ваш список float32 tolistпреобразует его в floatss - вероятно, это нежелательно. Использование list(myarray)не страдает от этого - почему мы должны предпочитать tolist?
Mr_and_Mrs_D

1
@Mr_and_Mrs_D вы предлагаете, чтобы, несмотря на наличие в вашем массиве чисел с плавающей точкой, вы хотели бы, чтобы результирующий список был целым числом? Это своего рода совершенно другой вопрос ... и, конечно, вам нужно будет указать, что, несмотря на то, что значения являются значениями типа float32, все они будут целочисленными. В любом случае, если бы у вас была такая ситуация, я думаю, что myarray.astype(np.int32).tolist()было бы вариант, и было бы ясно, что вы пытаетесь достичь. (И, наконец, list(array_of_type_float32)не дает здесь целых чисел, когда я попробовал это ... поэтому я не знаю, о чем вы спрашиваете.)
Питер Хансен

1
Я никогда не упоминал целые числа - попробуйтеfloat32_array = np.array([0.51764709], np.float32); print(float32_array.tolist()); print(list(float32_array))
Mr_and_Mrs_D

2
Итак, один преобразуется в [float], а другой все еще использует тип numPy скаляра float32, как [np.float32]. Хорошо. Полезно знать, но я предполагаю, желательно это или нет, зависит от каждого конкретного случая. Подозреваю, что, как правило, когда кто-то (например, OP) запрашивает преобразование в список, он неявно подразумевает список обычных типов данных Python, в данном случае это либо числа с плавающей запятой, либо целые числа, а не список пустых скалярных типов. , Спасибо за указание на это: я отредактировал ответ, чтобы включить примечание об этом.
Питер Хансен

Вдоль этих строк: np.array([[0, 'one'], ['two', 3]]).tolist() -> [['0', 'one'], ['two', '3']]
Keithpjolley

11

Метод numpy .tolist создает вложенные списки, если форма numpy массива двумерная.

если желательны плоские списки, метод ниже работает.

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`

5

tolist()работает нормально, даже если встречается вложенный массив, скажем, панды 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))


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.