Объедините два пустых вида в один вид, сложив их вдоль одной оси - PullRequest
0 голосов
/ 13 января 2019

Концептуально ли я что-то не понимаю (только похожий вопрос ) или почему размещение нескольких представлений вдоль первого axis=0 не приводит к новому представлению? Проблема: множественные двумерные массивы, отдельные строки которых должны быть объединены в одну новую матрицу, также позволяют не увеличивать использование памяти. Пример:

recs = np.arange(2*2).reshape(2,2)
recs2 = np.arange(4,2*2*2).reshape(2,2)
print(recs)
print(recs2)
rv0 = recs[0].view()
r2v0 = recs2[0].view()
#now combine
mview = np.stack([rv0,r2v0], axis=0)
print(mview)
np.may_share_memory(mview,recs2)

печать

[[0 1]
 [2 3]]
[[4 5]
 [6 7]]
[[0 1]
 [4 5]]
False #sure a copy

Это потому, что 2-мерные массивы являются отдельными областями памяти, а результирующий массив не разрешает нарезку и т. Д.?

1 Ответ

0 голосов
/ 13 января 2019

Все concatenate (stack - это просто еще один способ вызвать это) создать массив со своим собственным буфером данных. Это никогда не view оригинала (ов).

Ваш rv0 - это массив (np.ndarray), подобный recs, со своей собственной формой, dtype и шагами. Он просто разделяет буфер данных с recs. Его можно описать как «представление» recs, но в остальном он используется как любой другой массив. Он не помечен как класс или объект view.

In [409]: recs = np.arange(2*2).reshape(2,2)
     ...: recs2 = np.arange(4,2*2*2).reshape(2,2)

Поскольку recs - это reshape массива, созданного arange, это тоже "представление". Это можно сделать более очевидным с помощью:

temp = np.arange(2*2)
recs = temp.reshape(2,2)
np.may_share_memory(temp, recs)

Мы можем сделать мгновенный снимок, так сказать, буфера данных с помощью ravel() (который просто производит 1d просмотр):

In [411]: recs.ravel()
Out[411]: array([0, 1, 2, 3])
In [412]: recs2.ravel()
Out[412]: array([4, 5, 6, 7])

Теперь посмотрите на stack:

In [414]: mview = np.stack([recs,recs2], axis=0)
In [415]: mview
Out[415]: 
array([[[0, 1],
        [2, 3]],

       [[4, 5],
        [6, 7]]])
In [416]: mview.ravel()
Out[416]: array([0, 1, 2, 3, 4, 5, 6, 7])

ravel из mview не является подмножеством Out[411] и Out[412]. mview должен иметь свой собственный непрерывный буфер данных. Нет механизма создания массива, который разделяет память с двумя или более другими массивами (если только они не разделяют память).


Даже stack, созданный из кусочков одного и того же массива, имеет свой собственный буфер данных:

In [420]: x = np.stack((recs[0],recs[1]))
In [421]: x
Out[421]: 
array([[0, 1],
       [2, 3]])
In [422]: np.may_share_memory(recs, x)
Out[422]: False

Мне нравится использовать __array_interface__ для проверки местоположения буфера данных (другие определяющие атрибуты):

In [423]: recs.__array_interface__
Out[423]: 
{'data': (37584304, False),
 'strides': None,
 'descr': [('', '<i8')],
 'typestr': '<i8',
 'shape': (2, 2),
 'version': 3}

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