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]]

 posted on 2021-05-28 19:42  Rannie`  阅读(276)  评论(0编辑  收藏  举报
去除动画
找回动画