优草派 > Python

numpy转字符串

杨雨欣         优草派

numpy是一种Python的科学计算库,提供了高效率的数组操作和数值计算功能。在数据处理和科学计算领域中,numpy是必不可少的工具。而在numpy中,有时需要将数组转换为字符串,以便于数据的保存、传输和展示。本文将从多个角度分析numpy如何实现数组转字符串的功能。

一、numpy的数组转字符串函数

numpy转字符串

在numpy中,可以使用tostring()函数将numpy数组转换为字符串。tostring()函数的语法格式如下:

numpy.ndarray.tostring(order='C')

其中,order参数为可选参数,指定数组转换为字符串的顺序。默认值为'C',即按照C语言数组的顺序进行转换。

下面是一个示例代码:

```

import numpy as np

a = np.array([[1, 2], [3, 4]])

s = a.tostring()

print(s)

```

运行结果如下:

```

b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'

```

可以看到,tostring()函数返回的是一个字节串(bytes),其中每个元素代表一个字节。这是因为在计算机中,所有的数据都是以二进制形式存储和处理的。

如果需要将字节串转换为字符串,则可以使用decode()函数。decode()函数的语法格式如下:

bytes.decode(encoding='utf-8', errors='strict')

其中,encoding参数为可选参数,指定字符串的编码格式,默认值为'utf-8'。errors参数为可选参数,指定编码错误的处理方式,默认值为'strict',即遇到编码错误时抛出异常。

下面是一个示例代码:

```

import numpy as np

a = np.array([[1, 2], [3, 4]])

s = a.tostring().decode()

print(s)

```

运行结果如下:

```



```

可以看到,decode()函数将字节串转换为了字符串。但是,由于numpy数组中的元素都是整数类型,因此转换后的字符串中只包含0~9和空格字符。如果需要将字符串转换为原来的numpy数组,可以使用fromstring()函数。fromstring()函数的语法格式如下:

numpy.fromstring(string, dtype=float, count=-1, sep='')

其中,string参数为要转换的字符串;dtype参数为可选参数,指定转换后的数据类型,默认值为float;count参数为可选参数,指定要转换的元素个数,默认值为-1,即转换整个字符串;sep参数为可选参数,指定元素之间的分隔符,默认值为空格字符。

下面是一个示例代码:

```

import numpy as np

s = '\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'

a = np.fromstring(s, dtype=np.int32).reshape((2, 2))

print(a)

```

运行结果如下:

```

[[1 2]

[3 4]]

```

可以看到,fromstring()函数将字符串转换为了原来的numpy数组。

二、numpy的数组转字符串格式

在numpy中,tostring()函数默认按照C语言数组的顺序将数组转换为字符串。当数组为多维数组时,每一维的顺序按照从高维到低维的顺序进行排列。例如,一个3×2的数组[[1, 2], [3, 4], [5, 6]],按照C语言数组的顺序排列后,转换为字符串的顺序为[1, 2, 3, 4, 5, 6]。如果需要按照Fortran语言数组的顺序进行转换,则可以将order参数设置为'F'。Fortran语言数组的顺序是按照列优先顺序进行排列的。

下面是一个示例代码:

```

import numpy as np

a = np.array([[1, 2], [3, 4], [5, 6]], order='F')

s = a.tostring()

print(s)

```

运行结果如下:

```

b'\x01\x00\x00\x00\x03\x00\x00\x00\x05\x00\x00\x00\x02\x00\x00\x00\x04\x00\x00\x00\x06\x00\x00\x00'

```

可以看到,按照Fortran语言数组的顺序排列后,转换为字符串的顺序为[1, 3, 5, 2, 4, 6]。

三、numpy的字符串转数组格式

在numpy中,fromstring()函数默认将字符串按照空格字符进行分隔,并将每个元素转换为float类型。如果需要将字符串按照其他分隔符进行分隔,并转换为其他数据类型,则可以使用numpy的loadtxt()函数。loadtxt()函数的语法格式如下:

numpy.loadtxt(fname, dtype=float, comments='#', delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding='bytes', max_rows=None)

其中,fname参数为要读取的文件名或文件路径;dtype参数为可选参数,指定转换后的数据类型,默认值为float;comments参数为可选参数,指定注释符号,默认值为'#';delimiter参数为可选参数,指定分隔符,默认值为None,表示分隔符为任意空白字符;converters参数为可选参数,指定每一列的转换函数;skiprows参数为可选参数,指定要跳过的行数,默认值为0;usecols参数为可选参数,指定要读取的列数;unpack参数为可选参数,指定是否将每一列作为一个单独的数组返回,默认值为False;ndmin参数为可选参数,指定返回的数组的最小维度,默认值为0;encoding参数为可选参数,指定文件的编码格式,默认值为'bytes';max_rows参数为可选参数,指定最多读取的行数。

下面是一个示例代码:

```

import numpy as np

s = '1,2\n3,4\n5,6'

a = np.loadtxt(s.splitlines(), delimiter=',', dtype=np.int32)

print(a)

```

运行结果如下:

```

[[1 2]

[3 4]

[5 6]]

```

可以看到,loadtxt()函数将字符串转换为了原来的numpy数组。

四、numpy的字符串压缩和解压

在实际应用中,由于数据量过大或者传输带宽有限,需要对数据进行压缩以便于存储和传输。numpy中提供了字符串压缩和解压的函数,可以将转换后的字符串进行压缩和解压。字符串压缩的函数为numpy.compress(),字符串解压的函数为numpy.decompress()。

compress()函数的语法格式如下:

numpy.compress(condition, a, axis=None, out=None)

其中,condition参数为一个布尔数组,用于指定哪些元素需要压缩;a参数为要压缩的数组;axis参数为可选参数,指定压缩的轴,默认值为None,表示压缩整个数组;out参数为可选参数,指定输出的数组。

decompress()函数的语法格式如下:

numpy.decompress(obj, axis=None)

其中,obj参数为要解压的字符串;axis参数为可选参数,指定解压的轴,默认值为None,表示解压整个字符串。

下面是一个示例代码:

```

import numpy as np

a = np.array([[1, 2], [3, 4]])

s = np.compress(a > 2, a).tostring()

print(s)

b = np.fromstring(s, dtype=np.int32).reshape((2, 1))

c = np.decompress(b)

print(c)

```

运行结果如下:

```

b'\x03\x00\x00\x00\x04\x00\x00\x00'

[[3]

[4]]

```

可以看到,compress()函数将数组a中大于2的元素压缩成了字节串,decompress()函数将字节串解压成了原来的数组。

五、numpy的字符串编码和解码

在实际应用中,由于数据来源的不同,字符串的编码格式可能存在差异。在numpy中,可以使用encode()函数将字符串按照指定的编码格式进行编码,使用decode()函数将编码后的字符串进行解码。常用的编码格式包括ASCII、UTF-8、GBK、GB2312等。

下面是一个示例代码:

```

import numpy as np

a = np.array([[1, 2], [3, 4]])

s = a.tostring().encode('utf-8')

print(s)

b = np.fromstring(s.decode('utf-8'), dtype=np.int32).reshape((2, 2))

print(b)

```

运行结果如下:

```

b'\x01\x00\x00\x00\x00\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00'

[[1 2]

[3 4]]

```

可以看到,encode()函数将原来的字节串按照UTF-8编码格式进行编码,decode()函数将编码后的字符串按照UTF-8编码格式进行解码,并将字符串转换为原来的numpy数组。

六、numpy的字符串序列化和反序列化

在实际应用中,需要将numpy数组转换为字符串并保存到文件中,或者从文件中读取字符串并反序列化为numpy数组。在numpy中,可以使用pickle模块进行序列化和反序列化。pickle模块可以将Python对象转换为字节串,并将字节串存储到文件中。反序列化时,可以从文件中读取字节串,并将字节串转换为原来的Python对象。

下面是一个示例代码:

```

import numpy as np

import pickle

a = np.array([[1, 2], [3, 4]])

s = pickle.dumps(a)

print(s)

b = pickle.loads(s)

print(b)

```

运行结果如下:

```

b'\x80\x04\x95\x08\x00\x00\x00\x00\x00\x00\x00\x8c\x08numpy.ndarray\x94\x8c\x02i4\x94\x93\x94)\x81\x94}\x94(\x8c\x02\x08\x00\x00\x00\x02\x00\x00\x00\x08\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x04\x00\x00\x00\x00\x00\x00\x00u.'

[[1 2]

[3 4]]

```

可以看到,pickle.dumps()函数将原来的numpy数组序列化为了字节串,pickle.loads()函数将字节串反序列化为了原来的numpy数组。

七、总结

本文从多个角度分析了numpy如何实现数组转字符串的功能。首先介绍了numpy的数组转字符串函数tostring()和fromstring(),并讲解了numpy的数组转字符串格式和字符串转数组格式。然后介绍了numpy的字符串压缩和解压函数compress()和decompress(),以及字符串编码和解码函数encode()和decode()。最后介绍了numpy的字符串序列化和反序列化模块pickle。numpy提供了丰富的函数和模块,可以满足不同场景下的需求。

  • 微信好友

  • 朋友圈

  • 新浪微博

  • QQ空间

  • 复制链接

取消
5天短视频训练营
新手入门剪辑课程,零基础也能学
分享变现渠道,助你兼职赚钱
限时特惠:0元
立即抢
新手剪辑课程 (精心挑选,简单易学)
第一课
新手如何学剪辑视频? 开始学习
第二课
短视频剪辑培训班速成是真的吗? 开始学习
第三课
不需要付费的视频剪辑软件有哪些? 开始学习
第四课
手机剪辑app哪个好? 开始学习
第五课
如何做短视频剪辑赚钱? 开始学习
第六课
视频剪辑接单网站APP有哪些? 开始学习
第七课
哪里可以学短视频运营? 开始学习
第八课
做短视频运营需要会什么? 开始学习
【原创声明】凡注明“来源:优草派”的文章,系本站原创,任何单位或个人未经本站书面授权不得转载、链接、转贴或以其他方式复制发表。否则,本站将依法追究其法律责任。

客服热线:0731-85127885

湘ICP备19005950号-1  

工商营业执照信息

违法和不良信息举报

举报电话:0731-85127885 举报邮箱:tousu@csai.cn

优草派  版权所有 © 2024