2015-01-11 2 views
3

В чем разница между применением list() в массиве numpy против вызова tolist()?Разница между списком (numpy_array) и numpy_array.tolist()

Я проверял типы обоих выходов, и оба они показывают, что то, что я получаю в результате, - это list, однако выходы не выглядят точно так же. Это связано с тем, что list() не является специальным методом (т. Е. Может применяться к любой последовательности), а tolist()-numpy - конкретный, и только в этом случае они возвращают то же самое?

Входной сигнал:

points = numpy.random.random((5,2)) 
print "Points type: " + str(type(points)) 

Выход:

Points type: <type 'numpy.ndarray'> 

Входной сигнал:

points_list = list(points) 
print points_list 
print "Points_list type: " + str(type(points_list)) 

Выход:

[array([ 0.15920058, 0.60861985]), array([ 0.77414769, 0.15181626]), array([ 0.99826806, 0.96183059]), array([ 0.61830768, 0.20023207]), array([ 0.28422605, 0.94669097])] 
Points_list type: 'type 'list'' 

Вход:

points_list_alt = points.tolist() 
print points_list_alt 
print "Points_list_alt type: " + str(type(points_list_alt)) 

Выход:

[[0.15920057939342847, 0.6086198537462152], [0.7741476852713319, 0.15181626186774055], [0.9982680580550761, 0.9618305944859845], [0.6183076760274226, 0.20023206937408744], [0.28422604852159594, 0.9466909685812506]] 

Points_list_alt type: 'type 'list'' 
+3

Одним из них является списком списков, другой список 'numpy' массивов - потому что' .tolist' «идет вниз по дереву» и правильно делает каждый уровень в списки, а 'list (...)' just "ходит" на верхнем уровне. Итак, что ** ** вопрос ...? –

+0

Нет необходимости в этом утверждении вообще: напечатайте «Тип точек:» + str (тип (точки)), вы можете проверить тип переменной с помощью типа (varName_here) i.e., type (points) – Mohammed

ответ

7

Ваш пример уже показывает разницу; Рассмотрим следующую 2D массив:

>>> import numpy as np 
>>> a = np.arange(4).reshape(2, 2) 
>>> a 
array([[0, 1], 
     [2, 3]]) 
>>> a.tolist() 
[[0, 1], [2, 3]] # nested vanilla lists 
>>> list(a) 
[array([0, 1]), array([2, 3])] # list of arrays 

tolist обрабатывает полное преобразование в вложенных списков ваниль (т.е. list из list из int), в то время как list только итерацию по первому измерению массива, создание списка массивов (list от np.array от np.int64). Хотя оба списка:

>>> type(list(a)) 
<type 'list'> 
>>> type(a.tolist()) 
<type 'list'> 

в элементах каждого списка имеет разный тип:

>>> type(list(a)[0]) 
<type 'numpy.ndarray'> 
>>> type(a.tolist()[0]) 
<type 'list'> 

Другой разница, как вы обратите внимание, что list будет работать на любой итерации, в то время как tolist могут быть вызваны только объектами, которые специально реализуют этот метод.

2

.tolist() преобразовывает все значения рекурсивно в примитивы python (list), тогда как list создает список python из итерабельного. Поскольку NumPy массив представляет собой массив arrays, list(...) создает list из array s

Вы можете думать о list как функция, которая выглядит следующим образом:

# Not the actually implementation, just for demo purposes 
def list(iterable): 
    newlist = [] 
    for obj in iter(iterable): 
     newlist.append(obj) 
    return newlist 
1

Основным отличием является то, что tolist рекурсивно преобразует все данных в стандартные типы библиотек python.

Например:

>>> arr = numpy.arange(2) 
>>> [type(item) for item in list(arr)] 
[numpy.int64, numpy.int64] 
>>> [type(item) for item in arr.tolist()] 
[builtins.int, builtins.int] 

Помимо функциональных различий tolist обычно будет быстрее, как он знает, что имеет Numpy массив и доступ к массиву подложки. Принимая во внимание, что list вернется к использованию итератора, чтобы добавить все элементы.

In [2]: arr = numpy.arange(1000) 

In [3]: %timeit arr.tolist() 
10000 loops, best of 3: 33 µs per loop 

In [4]: %timeit list(arr) 
10000 loops, best of 3: 80.7 µs per loop 

я ожидал бы tolist быть

Смежные вопросы