Есть ли разница между list (array) и array.tolist () в Python? - PullRequest
4 голосов
/ 04 мая 2020

Следующие переменные кажутся похожими, но это не так, и я не понимаю, почему:

import ujson
import numpy as np

arr = np.array([1, 2, 3, 4])
arr_1 = arr.tolist()
arr_2 = list(arr)

arr_1 == arr_2  # True

ujson.dumps({'arr': arr_1})  # it works
ujson.dumps({'arr': arr_2})  # it does not work (OverflowError: Maximum recursion level reached)

Я использую Python -3.5.6, u json -1.35 и numpy -1.16.4.

Большое спасибо за вашу помощь !!

Ответы [ 2 ]

4 голосов
/ 04 мая 2020

numpy имеет свои собственные числа c типов данных для разных уровней точности.

Они созданы способами, которые позволяют легко сравнивать с обычными Python целыми числами.

np.int32(3) == 3   # True
[np.int32(1), 4] == [1, np.int32(4)]    # True

( Списки равны Python, если все элементы с одинаковым индексом равны )

Именно поэтому ваш arr_1 == arr_2.

Их нельзя легко сериализовать в json, но метод tolist преобразует их в обычные типы Python цифр c, которые допускают сериализацию .

0 голосов
/ 04 мая 2020
Функция

list() в Python - это конструктор, который возвращает список, и вы вводите в него итерацию. Что-то вроде: list([Iterable])

Он принимает один аргумент, который может быть любым объектом итератора в последовательностях, таких как String & Tuples или в коллекциях, таких как Set & Dictionary. Он является частью встроенных функций Python.

Принимая во внимание, что tolist() является частью Numpy Library и функционирует иначе, чем list(). Он возвращает любой массив NumPy в виде глубоко вложенного списка Python скаляров. Следовательно, возвращая копию массива в виде вложенного списка.

Как сказал @hpaulj, ваш код не работает, потому что list() работает в одном измерении, но tolist() углубляется в n-измерения.

Подробнее о list () и tolist () можно узнать здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...