Numpy-再认识认识ndarray

it2025-04-18  4

你好,我是goldsunC

让我们一起进步吧!

Numpy

相信Python做过数据处理的读者一定认识Numpy。

Numpy:是高性能科学计算和数据分析的一个Python模块,部分功能如下:

ndarray,一个具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。用于对整组数据进行快速运算的标准数学函数。用于读写磁盘数据的工具以及用于操作内存映射文件的工具。线性代数、随机数生成以及傅里叶变换等功能。用于集成由C、C++、Fortran等语言编写的代码的工具。

本篇所有示例均使用Jupyter notebook执行。

ndarray

ndarray是一个数组对象,可以是一维,也可以是多维。它可以看成一个同类型数据的容器,注意只能是同类型。每个数组都有一个shape和一个dtype,前者是数组的维度,后者说明这个数组的类型。

举个例子:

IN: import numpy as np IN: data = np.random.normal(loc=5,size = (3,4)) IN: data OUT: array([[5.45630309, 4.96479259, 5.04325018, 4.3818349 ], [5.65789235, 5.33666079, 3.41381665, 5.55164647], [4.29550451, 5.00098289, 4.58897991, 4.21724839]]) IN: data.shape OUT: (3, 4) IN: data.dtype OUT: dtype('float64')

(3,4)说明这是一个三行四列的数组,'float64'说明它是一个双精度浮点数数组,和C语言中的double一样。

创建ndarray

创建数组最简单的方法是使用array函数,它接受一切序列型的对象(甚至包括其它数组),然后产生一个新的含有传入数据的Numpy数组。

传入列表:

IN: data1 = [1,2,3,4,5] IN: arr = np.array(data1) IN: arr OUT: array([1, 2, 3, 4, 5]) IN: arr.shape arr.dtype OUT: (5,) dtype('int32')

嵌套序列:

IN: data2 = [[1,2,3,4,5],[6,7,8,9,10]] IN: arr2 = np.array(data2) IN: arr2 OUT: array([[ 1, 2, 3, 4, 5], [ 6, 7, 8, 9, 10]]) IN: arr2.shape arr2.dtype OUT: (2, 5) dtype('int32')

注意上边两次函数的使用,我们并没有指定数组的dtype,但是当创建完成后都有这个参数,这是因为如果在创建时没有显式的声明dtype,那么Numpy会自动为这个数组推断出一个较为合适的数据类型。当然,我们也可以显式的指定dtype,如下:

IN: arr3 = np.array(data2,dtype = 'float64') IN: arr3.dtype OUT: dtype('float64')

除了np.array之外,还有一些函数也可以新建数组。例如zeros、ones和empty。zeros会创建一个指定形状的全0数组,ones会创建一个指定形状的全1数组,empty会创建一个没有任何具体值的数组。

使用这三个函数,传入的参数只需要为一个表示形状的元组即可。

IN: arr4 = np.zeros((2,3)) IN: arr4 OUT: array([[0., 0., 0.], [0., 0., 0.]]) IN: arr5 = np.empty((2,2,2),dtype='int32') IN: arr5 OUT: array([[[ 131658048, 480], [ 411, 2037148018]], [[ 1216, 0], [ 4, 1684370531]]])

zeros和ones函数好理解,可是注意上边这个代码段,里面empty函数产生的是什么东西?不应该为空吗?错!实际上,很多情况下,empty函数返回的都是一些未初始化的垃圾值,你可以试一下,每一次运行都可能不一样。

最后,还记得Python内置的range函数吗,很多时候它很好用,那我们需要每次使用都要用np.array转换它吗,不用了,Numpy中的arange效果和range一样,只不过产生的是ndarray对象。

如:

IN: np.arange(10) OUT: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

一些数组创建函数:

array将输入的序列对象转换为ndarray。asarray将输入转换为ndarray,与array不同的是,如果传入对象是ndarray,那么新对象就是原对象。而array会是原对象副本。arange类似range,但是返回的是一个ndarray。ones、ones_like前者根据指定形状创建一个全1数组,后者传入的参数为另一个数组,看名字就看得出来,以另一个数组形状为参考。zeros、zeros_like类似ones,不过产生全0数组。empty、empty_like创建新数组,只分配内存空间而不填充值。eye、identity创建一个正方的NxN单位矩阵,注意是单位矩阵。(对角线为1,其余为0)

ndarray数据类型

dtype也就是ndarray的数据类型,它是让Numpy强大和灵活的原因之一,因为在大多数情况下,它们直接映射到相应的机器表示,这使得读写磁盘上的二进制数据流以及集成低级语言代码如C、Fortran等工作变得更加简单。Numpy中的数据类型如下:

类型类型代码说明int8、uint8i1、u1有符号和无符号的8位整型int16、uint16i2、u2有符号和无符号的16位整型int32、uint32i4、u4有符号和无符号的32位整型int64、uint64i8、u8有符号和无符号的64位整型float16f2半精度浮点数float32f4或f单精度浮点数,同C的floatfloat64f8或d双精度浮点数,同C的double和Python的floatfloat128f16或g扩展精度浮点数complex64、complex128c8、c16分别用两个32位、64位或128位浮点数表示的复数complex256c32复数bool?存储True和False的布尔类型objectOPython对象类型string_S固定长度的字符串类型,要创建长度10的字符串,使用S10。unicode_U固定长度的unicode类型,类似字符串。

astype

我们可以使用ndarray的astype方法显式的转换其dtype:

IN: arr6.dtype OUT: dtype('int64') IN: float_arr6 = arr6.astype(np.float64) IN: float_arr6.dtype OUT: dtype('float64')

如果使用此方法让整数转化为浮点数,那么浮点数的小数部分会被截断。

如果某字符串数组表示的全是数字,也可以用astype将其转换为数值形式:

IN: arr7 = np.array(['1.5','2.4','3.7'],dtype=np.string_) IN: arr7.dtype OUT: dtype('S3') IN: arr8 = arr7.astype(float) IN: arr8 arr8.dtype OUT: array([1.5, 2.4, 3.7]) dtype('float64')
最新回复(0)