Использование словаря в Numpy массив не делает этот массив иметь один тип данных - PullRequest
2 голосов
/ 13 января 2020

Я новичок в python и изучаю Numpy. Что я прочитал и протестировал, так это то, что np.array имеет один тип данных. Когда я использую его в обычном коде, он работает и ведет себя хорошо. т.е.

import numpy as np 
np1 = np.array([1,'2' , True])

for i in np1:
   print(type(i))

Ответ -

<class 'numpy.str_'>
<class 'numpy.str_'>
<class 'numpy.str_'>

Но когда мой код

np2 = np.array([{1:1 , 2:2 }, 1 , True , '1'])
for i in np2:
    print(type(i))

Ответ -

<class 'dict'>
<class 'int'>
<class 'bool'>
<class 'str'>

Что показывает, что элементы не относятся к классу numpy, как указано выше, ответ был <class 'numpy.str'>. Когда я напечатал print(type(np2)), ответ был <class 'numpy.ndarray'>. Можете ли вы объяснить, почему они не относятся к одному типу данных? Спасибо

Ответы [ 3 ]

3 голосов
/ 13 января 2020

Если требуемый тип данных для массива не указан, то тип " будет определен как минимальный тип, необходимый для хранения объектов в последовательности. "

В первом случай, минимальный тип str, потому что каждый элемент может быть преобразован в строку. Новый массив содержит строки.

Во втором случае минимальный тип - object (поскольку <class 'str'> и dict не могут быть преобразованы в строки). Новый массив содержит ссылки на объекты. Каждый объект имеет свой собственный тип.

Вы можете заставить np1 быть массивом объектов:

np1 = np.array([1, '2' , True], dtype=object)
type(np1[0]))
#<class 'int'>
type(np1[1]))
#<class 'str'>
type(np1[2]))
#<class 'bool'>
2 голосов
/ 13 января 2020

В интерактивном сеансе 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)
1 голос
/ 13 января 2020

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

мощный объект N-мерного массива

Таким образом, он имеет дело с любым элементом как объектом

Другой вещь:

Помимо очевидного научного использования c, NumPy может также использоваться в качестве эффективного многомерного контейнера generi c data . Произвольные типы данных могут быть определены. Это позволяет NumPy беспрепятственно и быстро интегрироваться с широким спектром баз данных.

Итак, массив NumPy старается эффективно хранить свои элементы как один и тот же тип данных, если это возможно, для оптимизации производительности. .

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