您的位置:

Python Numpy数据类型:高效处理数值计算

一、Numpy基础知识

NumPy是Python科学计算的基础库,提供了高性能的多维数组对象及其相关的运算。NumPy的核心理念是ndarray(n-dimensional array)。它是一个由同类型元素组成的多维数组,可以使用基于数组的计算来操作数据,不需要For循环。这种方式高效而简洁,也更接近于数学或科学的术语和概念。

>>> import numpy as np
>>> array = np.array([1,2,3])
>>> print(array) # [1,2,3]
>>> print(type(array)) # <class 'numpy.ndarray'>

Numpy数组和Python自带的列表对象类似,但是Numpy数组须具有相同类型的元素,并支持高效的基于数组的计算方法。创建数组时你可以指定dtype(数据类型),不过Numpy会自动推断出dtype。

>>> array1 = np.array([1, 2, 3, 4])
>>> print(array1)    # [1 2 3 4]
>>> print(array1.dtype)   # int32
>>> array2 = np.array([1, 2, 3, 4], dtype=float)
>>> print(array2)    # [1. 2. 3. 4.]
>>> print(array2.dtype)   # float64

二、Numpy数组的形状和轴

ndarray数组不仅有数据类型而且也有一个shape属性,即数组的形状。

>>> array = np.array([[1, 2, 3],
[4, 5, 6]])
>>> print(array)    # [[1 2 3]
                     #  [4 5 6]]
>>> print(array.shape)  # (2, 3)

数组的轴(axis)是从数组的维度角度来说的。
对于二维数组,第0轴是大小为2(数组的行数),第1轴是大小为3(数组的列数)。

>>> array = np.array([[1, 2, 3],
[4, 5, 6]])
>>> print(array.sum(axis=0)) # [5, 7, 9]
>>> print(array.sum(axis=1)) # [6, 15]

三、Numpy数组的运算

Numpy的优势在于可以对所有元素进行算术运算,减少常见的for循环操作。

>>> array1 = np.array([1,2,3,4])
>>> array2 = np.array([5,6,7,8])
>>> array3 = np.array([9,10,11,12])
>>> print(array1 + array2)    # [ 6  8 10 12]
>>> print(array2 - array1)    # [4 4 4 4]
>>> print(array1*array2)    # [ 5 12 21 32]
>>> print(array2 / array1)    # [5. 3. 2.33333333 2.]
>>> print(array1**array2)   # [    1    64  2187 65536]
>>> print(array2<6)    # [ True False False False]
>>> print(array3>10)    # [False False True True]

除了基本运算外,NumPy还有其他计算函数。例如,统计函数(如平均值,最大值和标准差)和几何函数(如花式索引,切片和字符串分类函数)。

>>> array = np.array([1,2,3,4])
>>> print(array.mean())    # 2.5
>>> print(array.max())    # 4
>>> print(array.min())    # 1
>>> print(array.std())     # 1.118033988749895
>>> print(array.argmax())  # 3
>>> print(array.argmin())  # 0

四、Numpy数组的矩阵运算

Numpy除了支持基本运算之外,还支持各种简单(例如点积)和复杂(例如矩阵分解)运算。

>>> A = np.array([[1.,2.],[3.,4.]])
>>> B = np.array([[5.,6.],[7.,8.]])
>>> print(A.dot(B))   # [[19. 22.]
                     #  [43. 50.]]
>>> print(np.dot(A,B))   # [[19. 22.]
                           #  [43. 50.]]
>>> C = np.array([5.,6.])
>>> print(np.dot(A,C))   # [17. 39.]

五、Numpy数组的索引和切片

NumPy数组的索引方法类似于Python列表。

>>> array = np.array([1,2,3,4])
>>> print(array[0])    # 1
>>> print(array[2])    # 3
>>> print(array[:3])    # [1 2 3]
>>> print(array[-2:])    # [3 4]
>>> array[:2] = 0
>>> print(array)    # [0, 0, 3, 4]

对于多维数组,可以使用逗号分隔的索引元组访问元素。

>>> array = np.array([[1, 2, 3],
[4, 5, 6]])
>>> print(array[0,1])    # 2
>>> print(array[1,2])    # 6
>>> print(array[:, 1:])    # [[2 3]
                             #  [5 6]]
>>> print(array[:2, 1:])    # [[2 3]
                               #  [5 6]]
>>> print(array[1,:2])     # [4 5]

六、Numpy数组的形状操作

在NumPy中,可以对现有数组进行重新形状,只需要使用reshape函数即可。

>>> array = np.array([[1, 2, 3],
[4, 5, 6]])
>>> print(array.shape)    # (2, 3)
>>> array2 = array.reshape(3,2)
>>> print(array2.shape)     # (3, 2)
>>> array3 = array.reshape(6,-1)
>>> print(array3.shape)    # (6, 1)

调整数组的形状时不会更改原始数组的数据。反之,改变了数组中的元素会影响到原始数组。

>>> array = np.array([[1, 2, 3],
[4, 5, 6]])
>>> array2 = array.reshape(3,2)
>>> array[0][1] = 8
>>> print(array2)    # [[1 8]
                      #  [3 4]
                      #  [5 6]]

七、Numpy数组的复制

NumPy ndarray对象的复制主要有两种:深度复制和浅复制。

>>> array = np.array([[1, 2, 3],
[4, 5, 6]])
>>> array2 = array.copy()
>>> array[0][1] = 8
>>> print(array2)   # [[1 2 3]
                     #  [4 5 6]]

上述代码中的array2是array的深复制,所以更改array并不会影响原始数据。

八、Numpy数组的随机数

NumPy还可以生成随机数。我们可以使用numpy.random子模块,它包含我们需要的所有实用程序。

>>> array = np.random.rand(2,2)
>>> print(array)   # [[0.91139848 0.81179606]
                     #  [0.84129243 0.94593798]]
>>> array2 = np.random.randn(2,2)
>>> print(array2)   # [[-0.1420801  -2.58851948]
                      #  [-0.33879746  1.07524694]]
>>> array3 = np.random.randint(low=1, high=10, size=(2,2))
>>> print(array3)   # [[9 6]
                      #  [2 8]]

九、Numpy数组的输入和输出

可以将Numpy数组写入和读取到磁盘。

>>> array = np.array([1, 2, 3, 4])
>>> np.save('array.npy', array)
>>> array2 = np.load('array.npy')
>>> print(array2)    # [1 2 3 4]

如果有多个数组,则可以使用掩码编码,然后将多个数组存储到单个文件中。

>>> array1 = np.array([1, 2, 3, 4])
>>> array2 = np.array([5, 6, 7, 8])
>>> np.savez('arrays.npz', x=array1, y=array2)
>>> data = np.load('arrays.npz')
>>> print(data['x'])    # [1 2 3 4]
>>> print(data['y'])    # [5 6 7 8]

十、Numpy的应用及拓展

Numpy的基本知识让我们能够建立数组和矩阵做统计分析或者图像处理等一些应用,以及在神经网络中需要对数据进行处理。

除此之外,扩展界面在dataframe(数据帧),时间序列分析,科学技术计算领域也可以方便调用。

十一、总结

Numpy对于数值计算在python中有着非常重要的作用。它提供了ndarray数据类型,用于高效、便利地处理大量数据的数值计算。

本文介绍了Numpy的基础知识、数组的形状和轴、数组的运算、数组的矩阵运算、数组的索引和切片、数组的形状操作、数组的复制、数组的随机数、Numpy数组的输入输出、各种应用的拓展等重要的方面。