Numpy, Python3.6 - не в состоянии понять, почему адрес отличается? - PullRequest
0 голосов
/ 27 августа 2018

Вот мой код

my_array_1 = np.arange(25).reshape(5, 5)
print(my_array_1)

my_array_red = my_array_1[:, 1::2]
print(my_array_red)

my_array_blue = my_array_1[1::2, 0:3:2]
print(my_array_blue)

my_array_yellow = my_array_1[-1, :]
print(my_array_yellow)

print(id(my_array_1))
print(id(my_array_red))
print(id(my_array_yellow))
print(id(my_array_blue))

print(my_array_1.data)
print(my_array_red.data)
print(my_array_blue.data)
print(my_array_yellow.data)

Вот вывод:

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]
[[ 1  3]
 [ 6  8]
 [11 13]
 [16 18]
 [21 23]]
[[ 5  7]
 [15 17]]
[20 21 22 23 24]
2606769150592
2606769282544
2607017647120
2606769282624
<memory at 0x0000025EFE56CA68>
<memory at 0x0000025EFE56CA68>
<memory at 0x0000025EFE56CA68>
<memory at 0x0000025EFE5A8F48>

Вопрос: Просто проверьте последние 4 строки моего вывода.почему my_array_1.data.data, my_array_red.data, my_array_blue.data имеют одинаковое значение, но где my_array_yellow.data имеют другое значение?

1 Ответ

0 голосов
/ 27 августа 2018

Я считаю data значение __array_interface__ более информативным:

In [2]: my_array_1.__array_interface__['data']
Out[2]: (33691856, False)
In [3]: my_array_red.__array_interface__['data']
Out[3]: (33691864, False)
In [4]: my_array_blue.__array_interface__['data']
Out[4]: (33691896, False)
In [5]: my_array_yellow.__array_interface__['data']
Out[5]: (33692016, False)

Out[2] - это начало буфера данных.

red - этоНа 8 байтов больше - это один элемент с начала.

blue - это 40 байтов - следующая строка

In [8]: my_array_1.strides
Out[8]: (40, 8)

yellow - это 160 байтов - это началопоследний ряд (40 от конца)

In [9]: 2016-1856
Out[9]: 160
In [10]: my_array_1.nbytes
Out[10]: 200

Все адреса data различаются, но находятся в одном поле.Но их труднее интерпретировать.

In [11]: my_array_1.data
Out[11]: <memory at 0x7fa975369a68>
In [12]: my_array_red.data
Out[12]: <memory at 0x7fa975369b40>
In [13]: my_array_blue.data
Out[13]: <memory at 0x7fa975369c18>
In [14]: my_array_yellow.data
Out[14]: <memory at 0x7fa9710f11c8>

Атрибут data можно использовать в конструкторе ndarray:

Два элемента из yellow:

In [17]: np.ndarray(2,dtype=my_array_1.dtype,buffer=my_array_yellow.data)
Out[17]: array([20, 21])

Те же 2 элемента, но с исходным адресом и смещением (как показано выше):

In [18]: np.ndarray(2,dtype=my_array_1.dtype,buffer=my_array_1.data, offset=160)
Out[18]: array([20, 21])

На самом деле дисплей data ничего не говорит нам огде находится буфер данных.Это адрес объекта memoryview, который ссылается на буфер, а не адрес самого буфера.Снова вызовите data и получите другой объект просмотра памяти:

In [19]: my_array_1.data
Out[19]: <memory at 0x7fa975369cf0>

Если я распечатываю эти объекты просмотра памяти, я получаю тот же шаблон, что и вы:

In [22]: print(my_array_1.data)
<memory at 0x7fa970e37120>
In [23]: print(my_array_red.data)
<memory at 0x7fa970e37120>
In [24]: print(my_array_blue.data)
<memory at 0x7fa970e37120>
In [25]: print(my_array_yellow.data)
<memory at 0x7fa9710f17c8>

Для 23 и 24 это просто повторное использование слота памяти, потому что при печати нет постоянства.Я не уверен, почему yellow не использует его повторно, за исключением того, что, возможно, объект достаточно отличается, чтобы он не помещался в одно и то же пространство.В случаях Out[11] и т. Д. Буферизация ipython висит на этих объектах, и, следовательно, нет повторного использования.

Это только подтверждает идею, что в отображении этих memoryview objects нет ничего существенного.Это не имеет никакого отношения к расположению буфера данных.Это больше похоже на id, просто произвольное место в памяти.

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