1

由于 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)

有任何想法吗?谢谢!

4

2 回答 2

4

恐怕你在混合不同的概念。

您的arrtup数组不是元组数组,它​​是结构化的ndarray,即看起来像元组但实际上是记录(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

Yournew_arr与 your 是不同的野兽arrtup:它具有相同的大小,没错,但它不再是结构化数组,而是对象数组,如图所示

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

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

于 2012-09-06T14:41:18.513 回答
2

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

但是,您可以很容易地将其转换为元组:

tuple(arrtup[0,1])

可以与其他元组连接:

tuple(arrtup[0,1]) + (4,4)
于 2012-09-06T14:39:32.233 回答