根據NumPy 官方檔案:
陣列協議型別字串(請參閱陣列介面)
...
- 'S', 'a' 以零結尾的位元組(不推薦)
- 'U' Unicode 字串
...
為了與 Python 2 向后兼容,S 和 a 型別字串保持以零結尾的位元組,并且 numpy.string_ 繼續別名為 numpy.bytes_。要在 Python 3 中使用實際字串,請使用 U 或 numpy.str_。對于不需要零終止的有符號位元組,可以使用 b 或 i1。[重點補充]
兩個問題:
- 如果我理解正確,
dt = np.dtype("S25") # 25-length zero-terminated bytes(來自 doc 的示例)應該只包含 24 個有效字符(位元組),因為最后一個是空終止符。考慮代碼
>>> import numpy as np
>>> arr = np.array(["aa", "bb"], dtype="S2") # bytes
>>> arr.data.tobytes()
b'aabb'
>>> arr.data.nbytes
4
>>> arr = np.array(["aa", "bb"], dtype="<U2") # unicode
>>> arr.data.tobytes()
b'a\x00\x00\x00a\x00\x00\x00b\x00\x00\x00b\x00\x00\x00'
>>> arr.data.tobytes()
16
So where are the null-terminators? I don't see the difference between it and Unicode when specifying zero-terminated.
- Why is this type not recommended? Pure bytes can save more space compared to UTF-32(or UTF-16).
uj5u.com熱心網友回復:
如果我理解正確,
dt = np.dtype("S25") # 25-length zero-terminated bytes(來自 doc 的示例)應該只包含 24 個有效字符(位元組),因為最后一個是空終止符。
實際上,并非總是如此。S25意味著將為每個字串項保留 25 個位元組。但是,如果它們更短,則在緩沖區中間插入一個零位元組。這是一個例子:
arr = np.array(["a", "bb"], dtype="S2")
arr.data.tobytes() # b'a\x00bb'
"a"被編碼為b'a\x00'因為它比限制 2 短。
為什么不推薦這種型別?與 UTF-32(或 UTF-16)相比,純位元組可以節省更多空間。
好吧,簡而言之:這是因為兼容性。早在 Unicode 之前,每個應用程式都使用自己的字符集。這是一團糟,因為大多數應用程式無法就標準字符集達成一致,也無法正確通信。這導致了很多錯誤。寬字串很快被用來解決短位元組字串的限制,這種限制在日本、中國甚至阿拉伯國家等國家根本無法正常使用。但是,這并不能解決主要問題:讓應用程式能夠就唯一的字符集達成一致。通用字符集(又名 Unicode)的誕生就是為了解決這個問題。這是一個巨大的成功。對于 Web 來說尤其如此。但是有一個問題:如何有效地編碼字串?
Unicode 標準定義了幾種編碼 Unicode 字串的方法。這包括 UTF-8、UTF-16 和 UTF-32 編碼。雖然 UTF-8 非常適合英語國家/地區,因為大多數字符都是 ASCII 字符集的一部分,因此 UTF-8 字串的空間可能與 ASCII 字串的空間相同。在這種情況下,計算/解碼 UTF-8 字串的性能非常快(盡管由于額外的檢查而比 ASCII 慢一點)。問題是當字串包含像中文、日文或阿拉伯文這樣的復雜字符時,大多數字符都被編碼為 2 到 4 個位元組。計算/解碼此類字串的效率非常低,因為處理器無法預測條件和SIMD指令幾乎無法使用。事實上,在這種情況下,UTF-16 比 UTF-8 占用的空間更少。這也是為什么亞洲/阿拉伯/非洲國家的人們通常更喜歡使用 UTF-16 而英語/歐洲國家更喜歡 UTF-8 的原因。UTF-32 在空間方面通常不是很好,但對于包含復雜字符的相對較短的字串來說,它比其他方法更快,這主要是因為 SIMD。它的實作也簡單得多。因此,這一切都是關于在空間、速度和特異性之間進行權衡,而結果基本上是區域特定的。
AFAIK,在 Numpy 中使用 UTF-32 的任何地方都沒有記錄,并且將來可能會發生變化。請注意,Numpy 傾向于速度而不是記憶體占用。它利用SIMD 指令集來加速大多數功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/440667.html
標籤:python arrays python-3.x string numpy
上一篇:關于順序搜索中的陣列的問題
