Как получить адрес для элемента в массиве Python? - PullRequest
0 голосов
/ 03 июля 2018

Я новичок и пытаюсь получить адрес элемента по определенному индексу в массиве Numpy или обычном Python. Я слежу за классом на Coursera, где преподаватель получает адрес, но я не совсем понимаю, могу ли я сделать то же самое на Python, поскольку класс преподается на другом языке. Вот математический пример того, что я пытаюсь выполнить с помощью кода: http://www.guideforschool.com/625348-memory-address-calculation-in-an-array/

Вот что я хотел бы сделать. Допустим, у меня есть следующий массив с индексами:

|_|_|_|_|_|_|_|
 1 2 3 4 5 6 7

Я бы хотел рассчитать адрес для индекса 4, поэтому вот расчет:

array_address + elem_size x (index - first_index)

Мне нужен первый элемент, массив_адрес или базовый адрес. Я пробовал это:

import numpy as np

a = np.ndarray([1,2,3,4,5,6,7])
print(a.__array_interface__['data'])

Но я продолжаю получать разные значения при каждом запуске, и это не для 1 конкретного индекса.

Я уверен, что мне никогда не придется делать эти расчеты, но я хочу понять все, что изучаю подробно. Или я буду использовать это? Какие примеры того, когда я бы использовал это?

1 Ответ

0 голосов
/ 03 июля 2018

Массив и его атрибуты:

In [28]: arr = np.arange(1,8)
In [29]: arr.__array_interface__
Out[29]: 
{'data': (41034176, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (7,),
 'version': 3}

Расположение буфера данных для среза:

In [30]: arr[4:].__array_interface__['data'][0]
Out[30]: 41034208
In [31]: arr[4:].__array_interface__['data'][0]-arr.__array_interface__['data'][0]
Out[31]: 32

Срез разделяет буфер данных, но со смещением 4 элемента (4 * 8).

Используя эту информацию, я могу получить фрагмент, используя конструктор ndarray (обычно не требуется):

In [35]: np.ndarray((3,), dtype=int, buffer=arr.data, offset=32)
Out[35]: array([5, 6, 7])
In [36]: arr[4:7]
Out[36]: array([5, 6, 7])

arr.data - это объект memoryview, который как-то ссылается на буфер данных этого массива. Идентификатор / адрес arr.data не совпадает с указателем данных, который я использовал выше.

In [38]: arr.data
Out[38]: <memory at 0x7f996d950e88>
In [39]: type(arr.data)
Out[39]: memoryview

Обратите внимание, что расположение данных для arr[4] совершенно другое. Это «без коробки», а не ломтик:

In [37]: arr[4].__array_interface__
Out[37]: 
{'data': (38269024, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (),
 'version': 3,
 '__ref': array(5)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...