Numpy:保存包含混合数据的numpy数组

Numpy:保存包含混合数据的numpy数组

在本文中,我们将介绍如何使用Numpy的save函数将包含混合数据的numpy数组保存到硬盘上。在Numpy中,我们可以使用save函数将numpy数组保存到磁盘上,以备以后使用。

通常,当我们保存numpy数组时,我们会将数组元素的数据类型统一。例如,当我们保存一个仅包含整数类型的numpy数组时,我们可以使用以下方式进行:

import numpy as np

# 创建一个包含整数的numpy数组
arr = np.array([1, 2, 3, 4, 5], dtype=np.int32)

# 使用save函数将numpy数组保存到硬盘上
np.save('my_array.npy', arr)
Python

上述代码将会将包含5个整数的numpy数组保存到磁盘上。但是,当我们要保存的numpy数组包含了多种数据类型时,该如何保存呢?下面是一个包含多种数据类型的numpy数组的例子:

import numpy as np

# 创建一个包含多种数据类型的numpy数组
arr = np.array([
                [1, 2, 3],
                [4.0, 5.0, 6.0],
                ['A', 'B', 'C'],
                [True, False, True]
            ])

# 尝试使用save函数将numpy数组保存到硬盘上
np.save('my_array.npy', arr)
Python

如果我们直接运行上述代码,将会出现以下错误:

ValueError: array is not contiguous. Only contiguous arrays are supported.
Python

这是由于numpy不支持将包含非同质数据类型的数组直接保存到硬盘上。但是,在某些情况下,我们确实需要保存这种类型的数组。那么,该如何解决这个问题呢?

阅读更多:Numpy 教程

使用Numpy的savez函数

Numpy提供了一个名为savez的函数,它可以将一个或多个numpy数组保存到硬盘上,并将它们打包成一个压缩文件。这样,我们就可以将包含非同质数据类型的numpy数组保存到硬盘上了。下面是一个将上述多种数据类型的numpy数组保存到硬盘上的例子:

import numpy as np

# 创建一个包含多种数据类型的numpy数组
arr = np.array([
                [1, 2, 3],
                [4.0, 5.0, 6.0],
                ['A', 'B', 'C'],
                [True, False, True]
            ])

# 将数组打包成一个字典
data = {'arr': arr}

# 使用savez函数将字典保存到硬盘上
np.savez('my_array.npz', **data)
Python

上述代码将会将包含多种数据类型的numpy数组保存到硬盘上。我们可以使用load函数将该数组加载到内存中:

import numpy as np

# 使用load函数将numpy数组从硬盘上加载到内存中
loaded_data = np.load('my_array.npz')

# 从loaded_data中读取名称为arr的数据
arr = loaded_data['arr']

# 打印arr
print(arr)
Python

上述代码将会打印如下输出:

array([['1', '2', '3'],
       ['4.0', '5.0', '6.0'],
       ['A', 'B', 'C'],
       ['True', 'False', 'True']], dtype='<U32')
Python

我们可以看到,打印出来的数组的数据类型为字符串类型(dtype='<U32’)。这是由于我们在保存数据时,numpy将所有的数据类型统一为了字符串类型。如果我们需要使用数组中的数据,我们需要将它们转换为正确的数据类型。

转换数组中的数据类型

上面的例子中,我们发现我们保存的包含多种数据类型的numpy数组,所有的数据类型都变成了字符串类型。如果我们需要使用数组中的数据,我们需要将它们转换为正确的数据类型。我们可以使用astype函数来完成这个任务。下面是一个将加载出来的字符串类型的numpy数组转换为包含多种数据类型的numpy数组的例子:

import numpy as np

# 使用load函数将numpy数组从硬盘上加载到内存中
loaded_data = np.load('my_array.npz')

# 从loaded_data中读取名称为arr的数据
arr = loaded_data['arr']

# 将字符串类型的数据转换为正确的数据类型
arr = arr.astype(dtype=[('col1', 'i4'), ('col2', 'f4'), ('col3', 'U1'), ('col4', 'bool')])

# 打印arr
print(arr)
Python

上述代码将会打印如下输出:

array([(1,  4., 'A',  True), (2,  5., 'B', False), (3,  6., 'C',  True)],
      dtype=[('col1', '<i4'), ('col2', '<f4'), ('col3', '<U1'), ('col4', '?')])
Python

我们可以看到,已经成功地将字符串类型的数据转换为了正确的数据类型。

总结

本文介绍了如何在Numpy中保存包含混合数据的numpy数组到硬盘上。我们发现,由于numpy不支持将包含非同质数据类型的数组直接保存到硬盘上,我们需要使用Numpy的savez函数将数组打包成一个压缩文件来保存。此外,我们还介绍了如何使用astype函数将加载出来的字符串类型的numpy数组转换为包含多种数据类型的numpy数组。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程