[英]Operator + to add a tuple to another tuple stored inside a multidimensional array of tuples
由于SO用户的巨大贡献,我最近发现了如何使用元组(请参见此处 )。 但是,我遇到了无法将元组添加到存储在元组数组中的另一个元组的问题。 例如,如果我定义:
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
数组不是元组的数组,而是结构化的ndarray
,即看起来像元组但实际上是记录的元素数组( numpy.void
是numpy.void
对象)。 在您的情况下,您将这些记录定义为由2个整数组成。 在内部,NumPy将您的数组创建为2x2的块数组,每个块占用dtype
定义的给定空间:在这里,一个块由2个大小为int
连续块组成(也就是说,每个子块都占用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
相同的约束,因为各个元素可以具有不同的大小,但是对象数组的效率不如结构化数组。
追溯在这里很清楚。 arrtup[0,1]
不是一个元组。 类型为“ numpy.void”。
您可以很容易地将其转换为元组:
tuple(arrtup[0,1])
可以与其他元组串联:
tuple(arrtup[0,1]) + (4,4)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.