В интерактивном сеансе ipython
объекты, такие как массивы, отображаются в их представлении repr
. Я нахожу это довольно информативным:
In [41]: np1 = np.array([1,'2' , True])
In [42]: np1
Out[42]: array(['1', '2', 'True'], dtype='<U21')
Обратите внимание на кавычки и U21
dtype. Оба показывают, что массив содержит строки, что и число, и логическое значение были преобразованы в общую строку dtype.
In [43]: np2 = np.array([{1:1 , 2:2 }, 1 , True , '1'])
In [44]: np2
Out[44]: array([{1: 1, 2: 2}, 1, True, '1'], dtype=object)
In [45]: [{1:1 , 2:2 }, 1 , True , '1']
Out[45]: [{1: 1, 2: 2}, 1, True, '1']
Обратите внимание на object
dtype. И отображение элемента в основном такое же, как для списка. Такой массив практически список. Есть некоторые различия, но для многих целей это можно рассматривать как список. У него мало преимуществ перед списком и есть некоторые недостатки. Он не имеет скорости вычисления массива цифр c numpy.
Буфер данных массива dtype объекта аналогичен базовому буферу списка. Оба содержат указатели или ссылки на объекты, хранящиеся в другом месте в памяти. В этом смысле у него есть один тип данных - ссылка.
===
Если я составлю список, а затем создам массив dtype объекта из этого списка:
In [48]: alist = [{1:1 , 2:2 }, 1 , True , '1']
In [49]: arr = np.array(alist)
In [50]: arr
Out[50]: array([{1: 1, 2: 2}, 1, True, '1'], dtype=object)
Я могу показать, что словарь в массиве - это тот же словарь, что и в списке. Они имеют одинаковые id
:
In [51]: id(arr[0])
Out[51]: 140602595005568
In [52]: id(alist[0])
Out[52]: 140602595005568
и модификации списка, отображаемые в массиве:
In [53]: alist[0][3]=3
In [54]: arr
Out[54]: array([{1: 1, 2: 2, 3: 3}, 1, True, '1'], dtype=object)