Is there a way to check if NumPy arrays share the same data?

前端 未结 4 1207
夕颜
夕颜 2020-11-30 03:56

My impression is that in NumPy, two arrays can share the same memory. Take the following example:

import numpy as np
a=np.arange(27)
b=a.reshape((3,3,3))
a[0         


        
4条回答
  •  有刺的猬
    2020-11-30 04:25

    I think jterrace's answer is probably the best way to go, but here is another possibility.

    def byte_offset(a):
        """Returns a 1-d array of the byte offset of every element in `a`.
        Note that these will not in general be in order."""
        stride_offset = np.ix_(*map(range,a.shape))
        element_offset = sum(i*s for i, s in zip(stride_offset,a.strides))
        element_offset = np.asarray(element_offset).ravel()
        return np.concatenate([element_offset + x for x in range(a.itemsize)])
    
    def share_memory(a, b):
        """Returns the number of shared bytes between arrays `a` and `b`."""
        a_low, a_high = np.byte_bounds(a)
        b_low, b_high = np.byte_bounds(b)
    
        beg, end = max(a_low,b_low), min(a_high,b_high)
    
        if end - beg > 0:
            # memory overlaps
            amem = a_low + byte_offset(a)
            bmem = b_low + byte_offset(b)
    
            return np.intersect1d(amem,bmem).size
        else:
            return 0
    

    Example:

    >>> a = np.arange(10)
    >>> b = a.reshape((5,2))
    >>> c = a[::2]
    >>> d = a[1::2]
    >>> e = a[0:1]
    >>> f = a[0:1]
    >>> f = f.reshape(())
    >>> share_memory(a,b)
    80
    >>> share_memory(a,c)
    40
    >>> share_memory(a,d)
    40
    >>> share_memory(c,d)
    0
    >>> share_memory(a,e)
    8
    >>> share_memory(a,f)
    8
    

    Here is a plot showing the time for each share_memory(a,a[::2]) call as a function of the number of elements in a on my computer.

    share_memory function

提交回复
热议问题