Python 如何比较numpy数组内存表示的相等性(例如,包括dtype)

Python 如何比较numpy数组内存表示的相等性(例如,包括dtype),python,numpy,Python,Numpy,如何比较两个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\u dtypes选项。我猜数组的内存表示也可能有其他不同的方式(例如endian ness)您

如何比较两个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\u dtypes
选项。我猜数组的内存表示也可能有其他不同的方式(例如endian ness)

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

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

如果要比较它们的大小和内容,可以使用以下方法检查数据内存的原始内容:


根据您希望涵盖的最小方面,将比较
x.dtype
(这包括endianness)
x.shape
x.strips

你可能还想看看一些旗帜。例如,
x.flags.aligned
可以被认为是广义内存布局的一部分,就像
x.flags.writeable
(可能还有
x.flags.owndata
)一样


另一方面,
C/F_continuous
标志在您了解形状和步幅后是多余的,最后还有
UPDATEIFCOPY
WRITEBACKIFCOPY
,我还不太了解,无法对此进行评论。

目前我正在使用
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)

但这似乎有点像黑客。

但这并不能比较内容?所以你的意思是内容和内存完全相同?是的-在所有方面都相同更新@user2667066我想我可以使用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)