NumPy Ndarray 介绍
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。
ndarray 内部由以下内容组成:
- 一个指向数据(内存或内存映射文件中的一块数据)的指针。
- 数据类型或 dtype,描述在数组中的固定大小值的格子。
- 一个表示数组形状(shape)的元组,表示各维度大小的元组。
- 一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
NumPy 创建数组
利用 array() 函数创建数组
array1 = [1,2,3]
m = np.array(array1)
print(m)
array2 = [[1,2,3],[4,5,6]]
n = np.array(array2)
print(n)
利用arange()和linspace()函数创建 “等差数列” 数组
np.arange(start,end,step):start和end表示起始位置,step表示步长,用于创建表示等差数列的一维数组,注意得到的结果数组不包含终值
np.linspace(start,end,num):start和end表示起始位置,num表示个数,用于创建表示等差数列的一维数组,可以通过endpoint参数指定是否包含终值,默认值为True,即包含终值
array1 = np.arange(1, 15)
array2 = np.arange(1, 15, 3)
# [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
# [ 1 4 7 10 13]
endpoint=True表示是包含终止值(默认),endpoint=False表示不包含终止值
type=np.float64指定创建的数组的数据类型默认是float64,你也可以设置为dtype=np.np.int32
arr1 = np.linspace(1, 20, num=5, endpoint=False, dtype=np.float64)
arr2 = np.linspace(1, 20, num=5, endpoint=False, dtype=np.int32)
arr3 = np.linspace(1, 20, num=5, endpoint=True, dtype=np.float64)
arr4 = np.linspace(1, 20, num=5, endpoint=True, dtype=np.int32)
# [ 1. 4.8 8.6 12.4 16.2]
# [ 1 4 8 12 16]
# [ 1. 5.75 10.5 15.25 20. ]
# [ 1 5 10 15 20]
创建 “指定数值填充” 的数组
np.zeros((3, 5)))
np.ones((3, 5))
np.full((3, 5), 8)
numpy.zeros(shape, dtype = float, order = 'C')
shape 形状
dtype 数据类型,可选(float, int) 默认为float
order 'C' 用于 C 的行数组,或者 'F' 用于 FORTRAN 的列数组
复制已有数组,创建指定数值的数组
如果我们知道一个数组的形状,想要创建一个和它形状相同的数组
- np.zeros_like():复制已有数组形状,创建一个全0数组;
- np.ones_like():复制已有数组形状,创建一个全1数组;
- np.full_like():复制已有数组形状,创建一个指定数值的数组;
单位矩阵和对角矩阵
创建单位矩阵,有 np.eye(x) 和 np.identity(x) 这两个函数
np.eye(3)
np.identity(3)
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
创建对角矩阵,利用 np.diag() 函数
np.diag([1, 2, 3, 4, 7])
[[1 0 0 0 0]
[0 2 0 0 0]
[0 0 3 0 0]
[0 0 0 4 0]
[0 0 0 0 7]]
logspace()函数创建 “等比数列” 数组
arange() 和 linspace() 函数,创建等差数列
利用 logspace() 函数,创建等比数列
np.logspace(start, stop, num=50, endpoint=True, base=, dtype=None)
start和stop表示指数次幂,base表示底数(默认是10),也就是公比;
endpoint=True表示是包含终止值(默认),endpoint=False表示不包含终止值
np.logspace(1, 6, 3, base=2, dtype=int)
# [ 2 11 64]
# [2的1次方,2的2次方,2的3次方 ... 2的6次方] 均匀的分成 3 个数,得到 [ 2 11 64]
NumPy Ndarray 数组属性
res = np.array([[1,2,3],[4,5,6]])
print(res.shape) # (2, 3) 数组形状
print(res.size) # 6 数组中元素个数
print(res.dtype) # int32 数组中元素数据类型
print(res.ndim) # 2 数组的维度
数组列表相互转换
列表转数组,直接将一个列表传入array()函数中
list1 = list(range(10))
array1 = np.array(list1)
print(array1)
# [0 1 2 3 4 5 6 7 8 9]
数组转列表,调用数组的tolist()方法
array1 = np.arange(10)
list1 = array1.tolist()
print(list1)
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
数组的数据类型转换
numpy中的数据类型转换,不要使用x.dtype修改元素的数据类型,最好用x.astype()这种方式
numpy中常用的的数据类型
numpy 中常用的数据类型,int类型和float类型
但是一般都不是直接写 int 和 float 的,而是像 int32、float64 这样的写法
在计算机中,最底层执行的是0和1组成的二进制指令,一个0或者1就代表着一个二进制位,又叫"比特位(bit)",这里的32或64就是代表二进制位。
根据计算机的换算单位,1字节=8二进制位,即"1bytes=8bit",因此,根据这种换算:"32bit-4bytes"、"64bit=8bytes"。
int32 说明了该数组中每个元素的数据类型是 int32,同时通过 32 我们又可以知道,该数组中每一个元素的存储空间是 4 字节,那么这个范围大致是 [-2147483648,2147483647]
使用astype()函数修改数组的数据类型
a = np.array([1.3,2.6,6.4])
print(a.dtype)
a2 = a.astype(np.float32)
print(a2.dtype)
# float64
# float32
改变ndarray数组的形状
使用numpy中的reshape()函数修改数组对象
a = np.arange(10).reshape(2, 5)
a2 = np.reshape(a, (5, 2))
print(a2)
# [[0 1]
# [2 3]
# [4 5]
# [6 7]
# [8 9]]
使用数组对象的reshape()方法修改数组对象
a = np.arange(10).reshape(2, 5)
print(a)
# [[0 1 2 3 4]
# [5 6 7 8 9]]
改变数组形状时,如果维度大于1,可以将“最后一个维度”设置为-1
a = np.arange(6).reshape(2, 3)
a2 = np.arange(6).reshape(2, -1)
print(a)
print(a2)
# [[0 1 2]
# [3 4 5]]
# [[0 1 2]
# [3 4 5]]
可以这样做的原因在于,当你指明了前面的维度,最后一个维度会根据数组元素个数和前面的维度数,自动计算出最后一个维度的维度数,也就是说【维度一 * 维度二 * … * 维度N = 元素个数】
NumPy 数组的属性T可用于获取矩阵的转置
a = np.arange(1, 7).reshape(3, 2)
print(a)
print(a.T)
# [[1 2]
# [3 4]
# [5 6]]
# [[1 3 5]
# [2 4 6]]