【问题标题】:Best way to get length of numpy unicode string dtype获取 numpy unicode 字符串 dtype 长度的最佳方法
【发布时间】:2019-09-26 16:13:17
【问题描述】:

我正在尝试确定 numpy unicode 数组的最大元素长度。例如,如果我有:

# (dtypes added for clarity)
a = np.array(['a'], dtype='U5')
print(get_dtype_length(a))

我希望它打印5

我可以这样做:

def get_dtype_length(a):
  dtype = a.dtype
  dtype_string = dtype.descr[0][1]  # == '<U5'
  length = int(dtype_string[2:])
  return length

但这似乎是一种迂回的方式来推断必须在某处可用的东西。是否有我没有找到直接执行此操作的属性或 numpy 函数?

基于 cmets 的说明:

我专门寻找数组中任何元素的最大允许长度,而不是任何特定元素的长度(例如,不是len(a[0]) == 1。这背后的动机是,如果我尝试通过 @ 之类的方式更新 a 987654325@我不希望元素被截断为stri

在 numpy 版本 1.19 中,我相信 np.can_cast(newVal.dtype, a.dtype, casting='safe') 对我的用例来说是一个有效的测试(因为在 1.19 中,安全也会测试强制转换是否会导致截断),但它仍然不能真正解决测试字符大小的问题.

【问题讨论】:

  • @MadPhysicist 但在这种情况下,项目大小不等于 4,这是 OP 正在寻找的答案
  • @myrtlecat。完全误读了这个问题。道歉。
  • 那么,也许答案是a.dtype.itemsize / 4? numpy 是否总是每个代码点使用 4 个字节来存储 unicode?​​span>
  • @myrtlecat。可能只是a.dtype.base.itemsize
  • 哇。这真的很不平凡。到目前为止,a.dtype.itemsize / alen([0]),但这并不可靠。

标签: python string numpy


【解决方案1】:

U4 中的4 是每个元素的字符串长度,而不是字符的大小:

第一个字符指定数据类型,其余字符指定每个项目的字节数,Unicode 除外,它被解释为字符数。

来自the docs

单个 Unicode 字符的大小在您的程序中可以是一个常量:

 sizeof_numpy_unicode_char = np.dtype('U1').itemsize

然后,您可以使用dtype.itemsize 或快捷方式ndarray.itemsize 将每个元素的总字节数除以此常量以获得缓冲区大小:

def get_length(a):
    return a.itemsize // sizeof_numpy_unicode_char

但字符的大小确实是固定的(通常是 4 个字节)。

【讨论】:

  • 仍然觉得应该有更直接的方式,但我更喜欢这种方式,而不是将字符串解释为整数。我不知道np.dtype('U1').itemsize 什么时候会改变,但感觉还是更好。
  • @Andrew。如果您在模块中设置常量,np.dtype('U1').itemsize 将不会在您的脚本中更改。如果效果好,您可以随时选择此答案。
  • 是的,我猜如果它改变了,它将是跨系统或 numpy 版本之类的?无论如何,不​​在运行脚本中
  • 谢谢,这很好用......不要像我之前所做的那样使用以下sizeof_numpy_unicode_char = np.unicode_('x').itemsize,它在 Win32 上给出 2,在 Linux 上给出 4,而 np.dtype('U1').itemsize 是自引用并给出 4在 Win32 和 Linux 上
猜你喜欢
  • 2014-01-05
  • 2014-06-15
  • 2013-03-10
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-25
  • 2010-12-24
相关资源
最近更新 更多