【问题标题】:With a NumPy Unicode array, why does dtype '|U5' become dtype '<U5'?使用 NumPy Unicode 数组,为什么 dtype '|U5' 变成 dtype '<U5'?
【发布时间】:2022-02-07 12:11:53
【问题描述】:

我从这个答案Python: Numpy Data IO, how to save data by different dtype for each column?的评论中了解到 那

那么'|'是什么意思表示在“|U5”中,为什么“|”在下面的示例中更改为“https://numpy.org/devdocs/user/basics.io.genfromtxt.html

data = u"1, abc , 2\n 3, xxx, 4"
# Without autostrip
np.genfromtxt(StringIO(data), delimiter=",", dtype="|U5")

array([['1', ' abc ', ' 2'],
       ['3', ' xxx', ' 4']], dtype='<U5')

【问题讨论】:

  • 不重要。
  • @ddejohn 您建议的答案部分回答了我的第一个问题。我很感激你的建议。但我还是想知道为什么|这意味着“不适用”更改为
  • @ddejohn、@richardec、@mozway:我同意 OP:关于为什么 | 变成 &lt; 的问题不是重复的。
  • @Warren 确实有道理,但也许应该更新标题?
  • @mozway:同意——新标题听起来怎么样?

标签: python numpy dtype


【解决方案1】:

U 数据类型将每个 Unicode 字符存储为一个 32 位整数(即 4 个字节)。超过一个字节的整数必须具有字节顺序,因此数据类型将显示&lt;&gt;S 类型的数组将每个字符存储在一个字节中,因此字节顺序无关紧要,字节顺序字符将为 |

例如,这里的 a1a2 包含单个 Unicode 字符。数组是用相反的字节顺序创建的。

In [248]: a1 = np.array(['π'], dtype='<U1')

In [249]: a2 = np.array(['π'], dtype='>U1')

In [250]: a1
Out[250]: array(['π'], dtype='<U1')

In [251]: a2
Out[251]: array(['π'], dtype='>U1')

检查每个数组中数据的实际字节数;您可以看到每种类型的不同顺序:

In [252]: a1.view(np.uint8)
Out[252]: array([192,   3,   0,   0], dtype=uint8)

In [253]: a2.view(np.uint8)
Out[253]: array([  0,   0,   3, 192], dtype=uint8)

当您在创建数组时使用 Unicode 类型指定 | 时,显然 NumPy 会忽略它并使用本机字节顺序,例如

In [254]: np.dtype("|U5")
Out[254]: dtype('<U5')

还不如根本不包括在内:

In [255]: np.dtype("U5")
Out[255]: dtype('<U5')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    • 1970-01-01
    • 1970-01-01
    • 2011-12-07
    相关资源
    最近更新 更多