Python中Numpy库学习指南(第一篇)
文章目录
前言
NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。本文会介绍Numpy的安装介绍和关于Numpy库中数组创建的相关操作。
提示:以下是本篇文章正文内容,下面案例可供参考
一、Numpy是什么?
NumPy 是一个运行速度非常快的数学库,主要用于数组计算,包含:
二、使用步骤
1.Numpy环境安装
代码如下(示例):
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple numpy
# 使用anaconda的小伙伴也可以用
conda install numpy
2.引入Numpy库
import numpy as np
3Nnumpy Ndarray 对象
NumPy 最重要的一个特点是其 N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。
ndarray 内部由以下内容组成:
跨度可以是负数,这样会使数组在内存中后向移动,切片中 obj[::-1] 或 obj[:,::-1] 就是如此。
创建一个 ndarray 只需要调用 Numpy 中的 array函数即可:
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
参数说明
名称 | 描述 |
---|---|
object | 数组或嵌套的数列 |
dtype | 数组元素的数据类型,可选 |
copy | 对象是否需要复制,可选 |
order | 创建数组的内存存储样式,C为行方向,F为列方向,A为任意方向(默认) |
subok | 默认返回一个与基类类型一致的数组 |
ndmin | 指定生成数组的最小维度,这里的参数不能改变数组形状 |
注:dtype ndmin 参数常用重点记忆
import numpy as np
# 一个维度
a = np.array([1,2,3])
print(a)# [1 2 3]
# 两个维度
b = np.array([[1,2,3],[4,5,6]])
print(b)# [[1 2 3] [4 5 6]]
# 维度设置
c = np.array([1,2,3,4,5], ndmin=2)
print(c)# [[1 2 3 4 5]]
# dtype 参数
d = np.array([1,2,3,4,5], dtype=np.float16)
print(d)# [1. 2. 3. 4. 5.]
Numpy 数据类型
numpy 支持的数据类型比 Python 内置的类型要多很多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。
在使用Numpy库需要指定数据类型时也可以用Python内置的类型,推荐使用Numpy库的类型。
下表列举了常用 NumPy 基本类型。
名称 | 描述 |
---|---|
bool_ | 布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,一般是 int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,一般情况下仍然是 int32 或 int64) |
int8 | 字节(-128 to 127) |
int16 | 整数(-32768 to 32767) |
int32 | 整数(-2147483648 to 2147483647) |
int64 | 整数(-9223372036854775808 to 9223372036854775807) |
uint8 | 无符号整数(0 to 255) |
uint16 | 无符号整数(0 to 65535) |
uint32 | 无符号整数(0 to 4294967295) |
uint64 | 无符号整数(0 to 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
Numpy 数组属性
NumPy 数组的维数称为秩(rank),秩就是轴的数量,即数组的维度,一维数组的秩为 1,二维数组的秩为 2,以此类推。
在 NumPy中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。比如,二维数组就相当于两个一维数组,其中一维数组的每一个元素又是一个一维数组。所以一维数组就是 NumPy 中的轴(axis),第一个轴相当于是底层数组,第二个轴是底层数组里的数组。而轴的数量——秩,就是数组的维数。
NumPy 的数组中比较重要 ndarray 对象属性有:
属性 | 说明 |
---|---|
ndarray.ndim | 秩,即轴的数量或维度的数量 |
ndarray.shape | 数组的维度,对于矩阵,n 行 m 列 |
ndarray.size | 数组元素的总个数,相当于 .shape 中 n*m 的值 |
ndarray.dtype | ndarray 对象的元素类型 |
ndarray.itemsize | ndarray 对象中每个元素的大小,以字节为单位 |
ndarray.flags | ndarray 对象的内存信息 |
1, ndarray.ndim
ndarray.ndim 用于返回数组的维度,说实话个人觉得shape也可以看数组维度比ndim函数更好用。
import numpy as np
a = np.array([1,2,3])
print(a.ndim)# 1
b = np.array([[1,2,3]])
print(b.ndim)# 2
2,ndarray.shape
ndarray.shape 表示数组的维度,返回一个元组,元组的长度表示维度的数目,元组中的每个元素表示维度中的数组数量。shape在后面作为参数也十分常见。
也可以用于改变数组的形状。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print(a.shape)# (2, 3)
a.shape = (3,2)
print(a)
'''
输出:
[[1 2]
[3 4]
[5 6]]
'''
在Numpy中也提供了一个reshape函数用来调整数组形状。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
b = a.reshape(3,2)
print(b)
'''
输出:
[[1 2]
[3 4]
[5 6]]
'''
3,Numpy 创建数组
ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建。
1,numpy.empty
用来创建指定形状的数组
numpy.empty(shape, dtype = float, order = 'C')
参数说明
参数 | 描述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选 |
order | 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。 |
import numpy as np
a = np.empty((2,3), dtype=np.int8)
# a = np.empty([2,3], dtype=np.int8) 用列表形式创建也可以
print(a)
'''
输出:
[[-16 70 37]
[ 82 58 2]]
'''
注:数组元素为随机值,因为它们没有初始化
2,numpy.zeros
创建指定大小的数组,用0来填充。
numpy.zeros(shape, dtype = float, order = 'C')
参数说明
参数 | 描述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选 |
order | ‘C’ 用于 C 的行数组,或者 ‘F’ 用于 FORTRAN 的列数组 |
import numpy as np
# 默认为浮点型
a = np.zeros((3,3))
print(a)
'''
输出:
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
'''
# 转为整型
a = np.zeros((3,3), dtype=np.int8)
print(a)=
3,numpy.ones
创建指定大小的数组,用1来填充。
numpy.ones(shape, dtype = None, order = 'C')
参数说明
参数 | 描述 |
---|---|
shape | 数组形状 |
dtype | 数据类型,可选 |
order | ‘C’ 用于 C 的行数组,或者 ‘F’ 用于 FORTRAN 的列数组 |
import numpy as np
a = np.ones((3,3))
print(a)
'''
输出:
[[1. 1. 1.]
[1. 1. 1.]
[1. 1. 1.]]
'''
# 默认为浮点型
a = np.ones((3,3), dtype=np.int8)
print(a)
# 转为整型
4、numpy.zeros_like
numpy.zeros 可以直接指定要创建的数组的形状,而 numpy.zeros_like 则是创建一个与给定数组具有相同形状的数组。
numpy.zeros_like(a, dtype=None, order='K', subok=True, shape=None)
参数说明
参数 | 描述 |
---|---|
a | 给定要创建相同形状的数组 |
dtype | 创建的数组的数据类型 |
order | 数组在内存中的存储顺序,可选值为 ‘C’(按行优先)或 ‘F’(按列优先),默认为 ‘K’(保留输入数组的存储顺序) |
subok | 是否允许返回子类,如果为 True,则返回一个子类对象,否则返回一个与 a 数组具有相同数据类型和存储顺序的数组 |
shape | 创建的数组的形状,如果不指定,则默认为 a 数组的形状。 |
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.zeros_like(a)
print(b)
'''
输出:
[[0 0 0]
[0 0 0]
[0 0 0]]
'''
5、numpy.ones_like
numpy.ones 可以直接指定要创建的数组的形状,而 numpy.ones_like 则是创建一个与给定数组具有相同形状的数组。
numpy.ones_like(a, dtype=None, order='K', subok=True, shape=None)
参数说明
参数 | 描述 |
---|---|
a | 给定要创建相同形状的数组 |
dtype | 创建的数组的数据类型 |
order | 数组在内存中的存储顺序,可选值为 ‘C’(按行优先)或 ‘F’(按列优先),默认为 ‘K’(保留输入数组的存储顺序) |
subok | 是否允许返回子类,如果为 True,则返回一个子类对象,否则返回一个与 a 数组具有相同数据类型和存储顺序的数组 |
shape | 创建的数组的形状,如果不指定,则默认为 a 数组的形状。 |
import numpy as np
a = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = np.ones_like(a)
print(b)
'''
输出:
[[1 1 1]
[1 1 1]
[1 1 1]]
'''
4,NumPy 从已有的数组创建数组
1、numpy.asarray
numpy.asarray 类似 numpy.array,但 numpy.asarray 参数只有三个,比 numpy.array 少两个。
numpy.asarray(a, dtype = None, order = None)
参数说明
参数 | 描述 |
---|---|
a | 任意形式的输入参数,可以是,列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组 |
dtype | 数据类型,可选 |
order | 可选,有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。 |
import numpy as np
# 将列表转换为数组
x1 = [1,2,3,4,5]
a1 = np.asarray(x1)
print(a1)
# 将元组转换为数组
x2 = (1,2,3,4,5)
a2 = np.asarray(x2)
print(a2)
# 将列表元组转换为数组,元素必须对齐
x3 = [(1,2,3),(4,5,6)]
a3 = np.asarray(x3)
print(a3)
2、numpy.fromiter
numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。
numpy.fromiter(iterable, dtype, count=-1)
参数说明
参数 | 描述 |
---|---|
iterable | 可迭代对象 |
dtype | 返回数组的数据类型 |
count | 读取的数据数量,默认为-1,读取所有数据 |
import numpy as np
# 创建一个列表
list1 = range(5)
it=iter(list)
# 使用迭代器创建 ndarray
arr = np.fromiter(it, dtype=np.float16, count=3)
print(arr)# 输出[0. 1. 2.]
5,NumPy 从数值范围创建数组
1,numpy.arange
numpy 包中的使用 arange 函数创建数值范围并返回 ndarray 对象,函数格式如下:
numpy.arange(start, stop, step, dtype)
参数说明
参数 | 描述 |
---|---|
start |
起始值,默认为0 |
stop |
终止值(不包含) |
step |
步长,默认为1 |
dtype |
返回ndarray 的数据类型,如果没有提供,则会使用输入数据的类型。 |
import numpy as np
# 创建一个0-4的数组
arr = np.arange(5)
print(arr)
# 设置步长和类型
arr1 = np.arange(10,20,2, dtype=np.float16)
print(arr1)
2,numpy.linspace
numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:
np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
参数说明
参数 | 描述 |
---|---|
start |
序列的起始值 |
stop |
序列的终止值,如果endpoint 为true ,该值包含于数列中 |
num |
要生成的等步长的样本数量,默认为50 |
endpoint |
该值为 true 时,数列中包含stop 值,反之不包含,默认是True。 |
retstep |
如果为 True 时,生成的数组中会显示间距,反之不显示。 |
dtype |
ndarray 的数据类型 |
import numpy as np
# 创建一个1-10的等差数列数组,不设置值时默认为浮点型
arr = np.linspace(1,10,10)
print(arr)# [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
# 生成一个全为一的等差数列数组
arr1 = np.linspace(1,1,10)
print(arr1)
# 设置endpoint 为 False 返回数组不包含 stop 的值
arr2 = np.linspace(1,11,10, endpoint=False)
print(arr2)# [ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]不包含11
# 生成10个等间距的数列,并且会返回步长
arr3 = np.linspace(1,10,10, retstep=True)
print(arr3)# (array([ 1., 2., 3., 4., 5., 6., 7., 8., 9., 10.]), 1.0)
总结
以上就是关于Numpy的简单介绍,以及Numpy中数组创建的相关操作。
接下来我会继续介绍关于Numpy的相关操作,作者也在学习中有错误望指正,谢谢。
作者:Rhryal