【问题标题】:How to compare equality of memory representation of numpy arrays (e.g. including dtype)如何比较 numpy 数组的内存表示的相等性(例如,包括 dtype)
【发布时间】:2019-05-23 21:03:05
【问题描述】:

如何比较两个 numpy 数组在内存中是否完全相同,例如

np.array([0,1]) == np.array([0,1])

是真的,但是

np.array([0,1]) == np.array([[0,1]])
np.array([0,1], dtype=np.int32) == np.array([0,1], dtype=np.int64)

都是假的。 np.array_equal 没有 compare_dtypes 选项。我想可能还有其他方法可以使数组的内存表示也有所不同(例如字节序)

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    您可以使用itemsize 来比较它们的字节长度:

    a1 = np.array([0,1], dtype=np.int32)
    a2 = np.array([0,1], dtype=np.int64)
    a1.itemsize == a2.itemsize
    # False
    

    如果你想比较它们的大小和内容,你可以用ndarray.tobytes检查数据内存的原始内容:

    a1.tobytes() == a2.tobytes()
    # False
    

    【讨论】:

    • 但这不比较内容?
    • 所以你的意思是内容和内存完全相同?
    • 是的 - 在所有方面都相同
    • 更新@user2667066
    • 我想我可以使用例如序列化pickle.dumps 并比较这些版本。不过有点hacky。肯定有内置的东西吗?
    【解决方案2】:

    根据您想要涵盖的最低限度,将比较x.dtype(包括字节序)x.shape 和x.strides。

    您可能还想查看一些标志。例如,x.flags.aligned 可以被视为广义上的内存布局的一部分,x.flags.writeable 也可能是(也可能是x.flags.owndata)。

    另一方面,一旦你知道形状和步幅,C/F_CONTIGUOUS 标志就是多余的,最后还有 UPDATEIFCOPY 和 WRITEBACKIFCOPY,我不太了解,无法评论。

    【讨论】:

      【解决方案3】:

      目前我正在使用pickle.dumps:

      import pickle
      a1 = np.array([0,1], dtype=np.int32)
      a2 = np.array([0,1], dtype=np.int64)
      pickle.dumps(a1) == pickle.dumps(a2)
      

      但这似乎有点不合时宜。

      【讨论】:

        猜你喜欢
        • 2019-03-13
        • 2012-06-04
        • 2021-11-13
        • 2012-05-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-26
        • 2022-01-14
        相关资源
        最近更新 更多