#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