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

时间:2012-09-06 14:36:04

标签: python arrays numpy scipy tuples

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

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

然后,如果我尝试将另一个元组添加到现有的tupe中以提出多维索引:

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

我收到此错误:

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

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

(3,4)+(4,4)

有什么想法吗?谢谢!

2 个答案:

答案 0 :(得分:4)

你害怕混合不同的概念。

你的arrtup数组不是一个元组数组,它​​是一个结构化ndarray,即一个看起来像元组但实际上是记录的元素数组(确切地说是numpy.void个对象。在您的情况下,您将这些记录定义为包含2个整数。在内部,NumPy将数组创建为2x2块数组,每个块占用由dtype定义的给定空间:此处,块由2个连续的大小为int的块组成(即每个子块) -block占用您机器上的int空间。

当您使用arrtup[0,1]检索元素时,您将获得相应的块。由于此块的结构为双子块,因此NumPy返回numpy.void(表示结构化块的通用对象),它与您的数组具有相同的dtype

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

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

的数组
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")

实际上,arrtupnewarr之间的内存布局完全不同。 newarrarrtup没有相同的约束,因为单个元素可以有不同的大小,但是对象数组不如结构化数组有效。

答案 1 :(得分:2)

这里的追溯非常清楚。 arrtup[0,1]不是元组。这是'numpy.void'类型。

您可以很容易地将它转换为元组:

tuple(arrtup[0,1])

可以与其他元组连接:

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