【问题标题】:Python/Numpy: How large can a Numpy Unicode array be?Python/Numpy:一个 Numpy Unicode 数组可以有多大?
【发布时间】:2021-06-08 17:33:50
【问题描述】:

一个 Numpy Unicode 数组可以有多大?

dtype = 'U100', 'U1000', 'U1000000'?

我找不到任何关于文档最大值的参考。

【问题讨论】:

  • 您是在问“Unicode 数组可以有多大?”或者您是在问“我可以在 Unicode 类型中存储的最大代码点是多少?Numpy 的 Unicode 类型是 Python 的字符串类型。它可以表示 Unicode 中的任何内容。它上升到 U+10FFFF。
  • 我认为问题是“Unicode 数组的元素可以有多大?”
  • numpy 不适用于大字符串。 nbtyes 对于 np.zeros((1000,), dtype='U500') 将是 1000*500*4,无论实际字符串如何。
  • repeattile 等函数不会更改dtype,也不依赖于dtype 详细信息(每个元素的字节数除外)。因此,无论 dtype 是数字还是“U1000”,它们的行为都是相同的。但正如您在另一个问题中发现的那样,最好使用列表和 Python 字符串将元素连接成更大的字符串。
  • @CraigNathan 太复杂了。 Python str 对象有很多开销。但是,可以实习 Python 字符串,如果您有很多潜在的重复,这将非常有效。由于本质上是神秘的各种优化,运行时可能会实习它们。但一般来说,使用sys.getsize,你应该会有一个想法,考虑到如果你想要U dtype,你必须使用最大可能的大小

标签: python numpy dtype


【解决方案1】:

我在https://numpy.org/doc/stable/reference/arrays.dtypes.html找到了这条线:

总 dtype itemsize 限于 ctypes.c_int

对于 32 位有符号整数,则为 2,147,483,647。但实际上,item 的字节大小也是有限的,所以除以 4(Unicode 码位大小)为2147483647 // 4 或 536,870,911。

>>> import numpy as np
>>> np.array(['abcdef'],dtype='U536870911')
array(['abcdef'], dtype='<U536870911')
>>> np.array(['abcdef'],dtype='U536870911').itemsize
2147483644

还有:

@987654322@

此数据类型对象的元素大小。

对于 21 种类型中的 18 种,此数字由数据类型固定。对于灵活的数据类型,这个数字可以是任何值。

【讨论】:

  • 很确定这不相关,该部分似乎在讨论以特定方式指定结构化数据类型
  • @juanpa.arrivillaga 大多数 dtypes 是结构化和固定大小的(1,2,4,8,...),但 Unicode 字符串是“灵活”数据类型之一。见更新。请注意,您可以将 dtype 指定为 'U10000'('U',10000),因此在谈到后者时,它也暗示了前者。
  • 我仍然不确定它到底在说什么,我想它一定是4倍数,因为np.array(['abcdefghij']).itemsize40。无论如何,我不确定这是 OP 的要求。
  • @juanpa.arrivillaga dtype 的每个元素的 Unicode 代码点数。对于实际数组,它是项目的字节大小。 x=np.array(['abcdef'],dtype=('U',2)) 返回 array(['ab'], dtype='&lt;U2')x.itemsize == 8
  • @juanpa.arrivillaga 实际上,如果代码点长度太长,则按字节排列的项目大小会溢出。在它抱怨之前我能够使用('U',2**29-1) 的大小(4x 即 0x7ffffffc)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-14
  • 2018-09-10
  • 2019-04-16
  • 2011-05-20
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多