Skip to main content
 首页 » 编程设计

python之运算符 + 将元组添加到存储在多维元组数组中的另一个元组

2025年05月04日20lhb25

由于 SO 用户的巨大贡献(参见 here),我最近发现了如何使用元组。但是我遇到了无法将元组添加到存储在元组数组中的另一个元组的问题。例如,如果我定义:

arrtup=empty((2,2),dtype=('int,int')) 
arrtup[0,1]=(3,4) 

然后,如果我尝试向现有元组中添加另一个元组以得出多维索引:

arrtup[0,1]+(4,4) 

我得到这个错误:

TypeError: unsupported operand type(s) for +: 'numpy.void' and 'tuple' 

而不是预期的 (3,4,4,4) 元组,我可以通过以下方式获得:

(3,4)+(4,4) 

有什么想法吗?谢谢!

请您参考如下方法:

恐怕您正在混合不同的概念。

你的 arrtup array 不是一个元组数组,它​​是一个结构化的 ndarray ,也就是说,一组看起来像元组但实际上是记录的元素(准确地说是 numpy.void 对象)。在您的例子中,您将这些记录定义为由 2 个整数组成。在内部,NumPy 将您的数组创建为 2x2 block 数组,每个 block 占用由 dtype 定义的给定空间。 :这里,一个 block 由大小为 int 的 2 个连续 block 组成(也就是说,每个子 block 占用 int 在您的计算机上占用的空间)。

当您使用 arrtup[0,1] 检索元素时,你得到相应的 block 。因为这个 block 的结构是两个子 block ,所以 NumPy 返回一个 numpy.void。 (表示结构化 block 的通用对象),具有相同的 dtype作为你的数组。

因为您在创建数组时设置了这些 block 的大小,所以您无法再修改它。这意味着您无法根据需要将 2 整数记录转换为 4 整数记录。

但是,您可以将结构化数组转换为对象数组:

new_arr = arrtup.astype(object) 

你看,你的元素不再是np.void但是元组,你可以根据需要修改:

new_arr[0,1] = (3,4) # That's a tuple 
new_arr[0,1] += (4,4) # Adding another tuple to the element 

你的 new_arr与你的 arrtup 不同:它具有相同的大小,没错,但它不再是结构化数组,而是对象数组,如

所示
>>> new_arr.dtype 
dtype("object") 

在实践中,arrtup 之间的内存布局大不相同。和 newarr . newarr没有与 arrtup 相同的约束,因为单个元素可以有不同的大小,但对象数组不如结构化数组高效。