2012-05-25 49 views
7

我想检查两个ndarrays是否具有相同基础ndarray的重叠视图。如何检查两块numpy阵列是否相同(或重叠)?

要检查两片完全相同的,我可以这样做:

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

缓冲区的比较似乎一个简单的例子来工作 - 任何人都可以告诉我,如果它的工作原理有什么看法?

不幸的是,这不适用于重叠切片,我还没有想出如何从缓冲区中提取它的偏移量在底层数据 - 也许有人可以帮助我呢?

而且,说abx片,cb片。由于基础数据是相同的,我还想检测ca之间的重叠。看起来,我应该能够逃避比较缓冲区和形状......如果有人能够确切地告诉我如何,我会很感激。

回答

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属性比较索引在内存中的位置。这可能需要一些工作,所以你可能想退一步,看看是否有不同的方式来解决你的问题。