как массивы numpy хранятся в ячейках памяти?

#numpy

Вопрос:

 a=np.array([[1,2],[4,5]])
b=a.T
print(a is b)
print(np.shares_memory(a,b))
for i in a:
    for j in I:
       print(i,j,id(j))
print('************')
for i in b:
    for j in I:
        print(i,j,id(j))

The output of the above code is
False
True
[1 2] 1 2027214431408
[1 2] 2 2027214431184
[4 5] 4 2027214431408
[4 5] 5 2027214431184
************
[1 4] 1 2027214431632
[1 4] 4 2027214431184
[2 5] 2 2027214431632
[2 5] 5 2027214431184
 

Мой вопрос в том, почему расположение альтернативных целочисленных объектов одинаково в приведенном выше коде. Поскольку python инициализирует разные ячейки памяти для каждого отдельного объекта

Комментарии:

1. id нет смысла смотреть на элементы массива. Массивы хранят элементы по значению, а не по ссылке. Прочитайте основные документы numpy, чтобы ответить на ваш вопрос о хранении.

Ответ №1:

 In [64]: a=np.array([[1,2],[4,5]])
    ...: b=a.T
 

data Значение from __array_interface__ указывает нам (в некотором смысле), где находится буфер данных массива. a и b имеет одинаковое значение, указывающее, что они совместно используют буфер.

 In [65]: a.__array_interface__
Out[65]: 
{'data': (74597280, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (2, 2),
 'version': 3}
In [66]: b.__array_interface__
Out[66]: 
{'data': (74597280, False),
 'strides': (8, 16),
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (2, 2),
 'version': 3}
 

b является a view of a , использующим тот же буфер, но со своим собственным shape и strides .

 In [67]: a.strides
Out[67]: (16, 8)
In [68]: b.strides
Out[68]: (8, 16)
 

Запрос id индексированного элемента ничего не говорит нам об этом буфере данных. Он просто идентифицирует объект, который был получен из массива — по значению, а не по ссылке. list хранит элементы по ссылке, массивы-нет.

 In [70]: type(a[0,1])
Out[70]: numpy.int64