簡體   English   中英

運算符+將一個元組添加到另一個存儲在元組多維數組中的元組中

[英]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.voidnumpy.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")

實際上, arrtupnewarr之間的內存布局是完全不同的。 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM