恐怕你在混合不同的概念。
您的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
和之间的内存布局有很大不同newarr
。newarr
没有与 相同的约束arrtup
,因为单个元素可以有不同的大小,但是对象数组不如结构化数组有效。