Numpy 字符串编码

2024-03-23

numpy 模块是一个出色的工具,可以有效地存储 Python 对象(其中包括字符串)。对于 numpy 数组中的 ANSI 字符串,每个字符仅使用 1 个字节。

然而,有一个不便之处。存储对象的类型不再是string but bytes,这意味着在大多数情况下必须解码才能进一步使用,这又意味着相当庞大的代码:

>>> import numpy
>>> my_array = numpy.array(['apple', 'pear'], dtype = 'S5')
>>> print("Mary has an {} and a {}".format(my_array[0], my_array[1]))
Mary has an b'apple' and a b'pear'
>>> print("Mary has an {} and a {}".format(my_array[0].decode('utf-8'),
... my_array[1].decode('utf-8')))
Mary has an apple and a pear

这种不便可以通过使用另一种数据类型来消除,例如:

>>> my_array = numpy.array(['apple', 'pear'], dtype = 'U5')
>>> print("Mary has an {} and a {}".format(my_array[0], my_array[1]))
Mary has an apple and a pear

然而,这只能通过将内存使用量增加 4 倍来实现:

>>> numpy.info(my_array)
class:  ndarray
shape:  (2,)
strides:  (20,)

itemsize:  20  
aligned:  True
contiguous:  True
fortran:  True
data pointer: 0x1a5b020
byteorder:  little
byteswap:  False
type: <U5

有没有一种解决方案既能兼顾高效内存分配和方便使用 ANSI 字符串的优点呢?


和上的区别不是很大decode, but astype有效(并且可以应用于整个数组而不是每个字符串)。但只要需要,较长的阵列就会保留下来。

In [538]: x=my_array.astype('U');"Mary has an {} and a {}".format(x[0],x[1])
Out[538]: 'Mary has an apple and a pear'

我在其中找不到任何内容format强制“b”少格式化的语法。

https://stackoverflow.com/a/19864787/901925 https://stackoverflow.com/a/19864787/901925- 展示如何自定义 Formatter 类,更改format_field方法。我尝试了类似的东西convert_field方法。但调用语法还是很乱。

In [562]: def makeU(astr):
    return astr.decode('utf-8')
   .....: 

In [563]: class MyFormatter(string.Formatter):
    def convert_field(self, value, conversion):
        if 'q'== conversion:
            return makeU(value)
        else:
            return super(MyFormatter, self).convert_field(value, conversion)
   .....:         

In [564]: MyFormatter().format("Mary has an {!q} and a {!q}",my_array[0],my_array[1])
Out[564]: 'Mary has an apple and a pear'

进行此格式化的其他几种方法:

In [642]: "Mary has an {1} and a {0} or {1}".format(*my_array.astype('U'))
Out[642]: 'Mary has an pear and a apple or pear'

这会(即时)转换数组并将其传递给format作为一个列表。如果数组已经是 unicode,它也可以工作:

In [643]: "Mary has an {1} and a {0} or {1}".format(*uarray.astype('U'))
Out[643]: 'Mary has an pear and a apple or pear'

np.char具有将字符串函数应用于字符数组元素的函数。有了这个decode可以应用于整个数组:

In [644]: "Mary has a {1} and an {0}".format(*np.char.decode(my_array))
Out[644]: 'Mary has a pear and an apple'

(如果数组已经是 unicode,则这不起作用)。

如果你对字符串数组做了很多工作,np.char值得研究。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Numpy 字符串编码 的相关文章

随机推荐