假设我有:
tup1 = ((100,), (100,))
tup2 = tuple(map(tuple, np.array([100, 100]).reshape(-1,1)))
现在tup1 == tup2返回True(我意识到它来自结构平等).
但是,作为一些python项目的一部分,我正在尝试执行以下操作:
from comtypes.automation import (byref, windll,
POINTER, VARIANT, PyDLL, py_object, wintypes)
_dll = PyDLL(pythoncom.__file__)
_pack = _dll.PyCom_VariantFromPyObject
_pack.argtypes = py_object, POINTER(VARIANT)
_pack.restype = wintypes.BOOL
现在
_pack(tup1, VARIANT())
同时工作
_pack(tup2, VARIANT())
抛出一个例外. tup1和tup2在哪些方面实际上有所不同(除了指向内存中的不同地址),这可能导致这种情况
最佳答案 每种类型的对象都可以用自己的术语定义相等.当元组具有相同的长度并且它们的内容被测试为相等时,它们是相等的.内容测试相同,因为两者都是元组,每个测试在配对时都相等.
但是,虽然嵌套元组中的整数值测试相同,但它们的类型不同.整数测试数值上的相等,所以1 == 1.0也是如此,即使一个对象是一个整数,另一个是浮点数.同样,tup1 [0] [0] == tup2 [0] [0]为真,因为双方具有相同的数值100.
虽然第一个元组有Python int对象,但你的第二个元组却没有.相反,你在这里有一个numpy特定的整数类型:
>>> import numpy as np
>>> tup2 = tuple(map(tuple, np.array([100, 100]).reshape(-1,1)))
>>> tup2[0][0]
100
>>> type(tup2[0][0])
<class 'numpy.int64'>
这很难看出,因为值的表示看起来与Python int类型完全相同,但是对于您正在进行的特定C API调用,numpy.int64不被识别为可接受的类型.
您需要将这些int64对象转换回标准Python整数:
>>> int(tup2[0][0])
100
>>> type(int(tup2[0][0]))
<class 'int'>
如果您使用array.tolist()
,您实际上可以告诉numpy数组为您执行此操作:
>>> np.array([100, 100]).reshape(-1,1).tolist()
[[100], [100]]
>>> type(np.array([100, 100]).reshape(-1,1).tolist()[0][0])
<class 'int'>
从array.tolist()文档:
Return a copy of the array data as a (nested) Python list. Data items are converted to the nearest compatible Python type.
(大胆强调我的).
从那里创建你的元组:
tup2 = tuple(map(tuple, np.array([100, 100]).reshape(-1,1).tolist()))
虽然.tolist()为您提供了Python类型等效的(嵌套)列表结构,但是如果您需要从现有数组中有效访问此类值,则还可以使用numpy.item()
method获取单个值.