NumPy 系列(一):numpy 数组基础
导入 NumPy 时,通常给其一个别名“np”,即 import numpy as np。
NumPy 库中的函数,要在函数名前加上导入的库名 np. 才能使用。
1.1 数据类型
(1)整数型数组与浮点型数组
为克服列表的缺点,一个 NumPy 数组只容纳一种数据类型,以节约内存。为方便起见,可将 NumPy 数组简单分为整数型数组与浮点型数组。
import numpy as np
# 创建整数型数组
arr1=np.array([1,2,3]) # 元素若都是整数,则为整数型数组
print(arr1)
[1 2 3]
# 创建浮点型数组
arr2=np.array([1.0,2,3]) # 内含浮点数,则为浮点型数组
print(arr2)
[1. 2. 3.]
注意,使用 print 输出 NumPy 数组后,元素之间没有逗号,这有两个好处,
一是可以可将之与 Python 列表区分开来,二是避免逗号与小数点之间的混淆。
(2)同化定理
一个人的力量是无法改变全体的,在实际操作中要注意:
- 往整数型数组里插入浮点数,该浮点数会自动被截断为整数;
- 往浮点型数组里插入整数,该整数会自动升级为浮点数;
import numpy as np
arr1=np.array([1,2,3])
arr1[1]=10.0 # 插入浮点数,被截断,数组仍然为整数型
print(arr1)
[ 1 10 3]
arr2=np.array([1.0,2,3])
arr2[2]=32 # 插入整数型,被升级,数组仍为浮点数
print(arr2)
[ 1. 2. 32.]
(3)共同改变定理
同化定理告诉我们,整数型数组和浮点型数组之间的界限十分严格,那么如
何将这两种数据类型的数组进行相互转化呢?既然某一个人容易被集体所同化,
那只要全体共同改变,自然就可以成功。
整数型数组和浮点型数组相互转换,规范的方法是使用 .astype() 方法。
import numpy as np
arr1=np.array([1,2,3])
arr2=arr1.astype(float)
print(arr1)
print(arr2)
arr3=arr2.astype(int)
print(arr3)
[1 2 3]
[1. 2. 3.]
[1 2 3]
除了上述方法,只要满足共同改变定理,整数型数组和浮点型数组仍然可以
互相转换。最常见的是整数型数组在运算过程中升级为浮点型数组,示例如下。
import numpy as np
arr=np.array([1,2,3])
print(arr)
# 整数型数组与浮点数作运算
print(arr+0.0)
print(arr*1.0)
[1 2 3]
[1. 2. 3.]
[1. 2. 3.]
# 整数型数组遇到除法(即便是除以整数)
print(arr/1)
[1. 2. 3.]
# 整数型数组与浮点型数组做运算
int_arr=np.array([1,2,3])
float_arr=np.array([1.2,3,4])
print(int_arr+float_arr)
[2.2 5. 7. ]
整数型数组很好升级,但浮点型数组在运算过程中一般不会降级。
1.2 数组维度
(1)一维数组与二维数组
考虑到深度学习中三维及其以上的数组出现次数少,我们后续主要 讲 解
NumPy 中的一维数组和二维数组,学了一维和二维后,很好类推到三维。
- 不同维度的数组之间,从外形上的本质区别是
一维数组使用 1 层中括号表示;
二维数组使用 2 层中括号表示;
三维数组使用 3 层中括号表示。 - 有些函数需要传入数组的形状参数,不同维度数组的形状参数为
一维数组的形状参数形如: x 或 (x,) ;
二维数组的形状参数形如: (x,y) ;
三维数组的形状参数形如: (x,y,z) 。 - 现在以同一个序列进行举例
当数组有 1 层中括号,如[1 2 3],则其为一维数组,其形状是 3 或 (3,) ;
当数组有 2 层中括号,如[[1 2 3]],则其为二维数组,其形状是 (1,3) ;
当数组有 3 层中括号,如[[[1 2 3]]],则其为三维数组,其形状是 (1,1,3) ;
这里用后面要讲的 np.ones( ) 函数进行演示,只因其刚好需要传入形状参数。
import numpy as np
arr1=np.ones(3) # 传入形状为3
print(arr1) # 造出一维数组(向量)
arr2=np.ones((1,3)) # 传入形状为(1,3)
print(arr2) # 造出二维数组
arr3=np.ones((1,1,3)) # 传入形状为(1,1,3)
print(arr3) # 造出三维数组
[1. 1. 1.]
[[1. 1. 1.]]
[[[1. 1. 1.]]]
print(arr1.shape)
print(arr2.shape)
print(arr3.shape)
(3,)
(1, 3)
(1, 1, 3)
大家可以随时留意一下数组的维度(通过中括号的数量),后面有些函数(比如数组的拼接函数)需要两个数组是同维度的。
(2)不同维度数组之间的转换
一维数组转二维数组,还是二维数组转一维数组,均要使用的是数组的重塑方法 .reshape( ) ,该方法需要传入重塑后的形状(shape)参数。
这个方法神奇的是,给定了其他维度的数值,剩下一个维度可以填-1,让它自己去计算。比如把一个 5 行 6 列的矩阵重塑为 3 行 10 列的矩阵,当列的参数10 告诉它,行的参数直接可以用-1 来替代,它会自己去用 30 除以 10 来计算。
首先,演示将一维数组升级为二维数组。
import numpy as nparr1=np.arange(10)
print(arr1)
arr2=arr1.reshape((-1,1))
print(arr2)
arr3=arr1.reshape((1,-1))
print(arr3)
[0 1 2 3 4 5 6 7 8 9]
[[0][1][2][3][4][5][6][7][8][9]]
[[0 1 2 3 4 5 6 7 8 9]]
这里给.reshape( )传入的形状参数是(1,-1),正常情况下我们都肯定是(1,10),
这里(1,-1)的含义是:行的参数是 1 行,列的参数-1 自己去除着算吧。
接着,演示将二维数组降级为一维数组。
import numpy as np
arr1=np.arange(10)
print(arr1)
arr2=arr1.reshape((-1,5))
print(arr2)
arr3=arr2.reshape(-1)
print(arr3)
[0 1 2 3 4 5 6 7 8 9]
[[0 1 2 3 4][5 6 7 8 9]]
[0 1 2 3 4 5 6 7 8 9]
这里给.reshape( )传入的形状参数是 -1 ,正常情况应该是 10,这里-1 的含
义是:反正是一维数组,形状直接自己去算吧。
现规定,本讲义中,将一维数组称为向量,二维数组称为矩阵。