2012-05-25 2 views
7

Я хотел бы проверить, являются ли два ndarrays перекрывающимися представлениями одного и того же базового ndarray.Как проверить, что два сегмента массива numpy одинаковы (или перекрываются)?

Чтобы проверить, что два ломтика точно так же, я могу сделать что-то вроде:

a.base is b.base and a.shape == b.shape and a.data == b.data 

Сравнение буферов, казалось, работать в одном простом случае - может кто-нибудь сказать мне, если он работает в целом?

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

Кроме того, говорят a и b являются кусочками x и c является кусочком b. Поскольку базовые данные одинаковы, я также хотел бы обнаружить перекрытия между c и a. Казалось бы, я должен уйти от сравнения только буфера и формы ... если бы кто-нибудь мог сказать мне, как именно, я был бы благодарен.

ответ

9

numpy.may_share_memory() - лучшая эвристика, которую мы имеем на данный момент. Он консервативно эвристичен; он может дать вам ложные срабатывания, но он не даст вам ложных негативов. Я думаю, что могут быть способы улучшить эвристику, чтобы быть на 100% правильной. Если они развернутся, они будут свернуты в эту функцию, так что это лучший путь вперед.

+0

Какие случаи я могу ожидать, чтобы потерпеть неудачу? Если его только шахматные фрагменты с шагом не единицы, которые генерируют ложные положительные, я могу жить с этим .... – shaunc

+2

'x [0 :: 2]'/'x [1 :: 2]'. 'x [:, 0: 5]', 'x [:, 5:10]'. 'x = np.dstack (* args); np.may_share_memory (x [0], x [1]) '. –

1

Возможно, можно сравнить, где индексы живут в памяти, используя свойство массивов ctypes. Это может занять некоторую работу, поэтому вам может потребоваться отступить и посмотреть, есть ли другой способ решения вашей проблемы.