由于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)
有什么想法吗?谢谢!
答案 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")
实际上,arrtup
和newarr
之间的内存布局完全不同。 newarr
与arrtup
没有相同的约束,因为单个元素可以有不同的大小,但是对象数组不如结构化数组有效。
答案 1 :(得分:2)
这里的追溯非常清楚。 arrtup[0,1]
不是元组。这是'numpy.void'类型。
您可以很容易地将它转换为元组:
tuple(arrtup[0,1])
可以与其他元组连接:
tuple(arrtup[0,1]) + (4,4)