Advertisement

NumPy~学习总结(读书笔记作业)

阅读量:

什么是 NumPy?

NumPy(Numerical Python 的缩写)是Python科学计算领域的基石库。

作为功能强大的Python库,NumPy为用户提供了一个丰富且全面的功能接口。

它不仅支持多维数组对象,并且提供了各种衍生数据结构类型。

NumPy涵盖了数学运算、逻辑操作、形状调整等核心功能模块。

此外,该库还集成输入输出操作、离散傅里叶变换等实用模块,并提供基本线性代数运算支持。

最后,在统计运算和随机模拟等方面也展现了强大的实用性。

----NumPy官方中文文档

应用场景:NumPy 常常用 SciPy(Python科学计算库)和 Matplotlib(Python绘图库)进行集成使用,并已广泛应用于替代 MatLab 的场景中。

安装和导入NumPy

使用Python包管理器pip命令安装

复制代码
 # windows下安装(或安装Ancaonda)

    
 pip install numpy
    
 #这里的NumPy需要小写为numpy,后面导入的时候也是这样!!!
    
    
    
    
    代码解读

使用前请先导入Numpy包!

复制代码
 import numpy

    
 #  通常起个名字:np
    
 import numpy as np
    
    
    
    
    代码解读

查看你自己的NumPy版本

复制代码
 import numpy as np

    
 print(np.__version__)
    
 # 1.导包
    
 # 2.双下划线
    
    
    
    
    代码解读

NumPy Ndarray 对象

Numpy提供了两种基本对象:

- ndarray :多维数组,后简称数组

- ufunc :能够对多维数组(数组)进行处理的特殊函数

NumPy库的核心数据结构是多维数组对象ndarray,并提供了一系列针对该ndarray对象执行操作的功能。(该结构能够一次性高效处理整个数据块,并且其存储特性确保所有元素具有相同的类型属性)通过共享内存机制实现高效的数据存储方式,在内存分配上实现了资源的最佳利用:每个元素占用等量的内存空间,并且占据独立的一块存储区域。与Python内置列表不同,ndarray能够直接保存原始数据而不依赖于引用机制

复制代码
    numpy.array(object, dtype = None, copy = Ture, order = None, subok = False, ndmin = 0)
    
    代码解读

参数说明:

名称 描述
object 可以是数组或者嵌套的数列
dtype 数组元素的数据类型,可选
copy 对象是否需要复制,可选
order 创建数组的样式,C为行方向,F为列方向,A为默认(任意方向)
subok 默认返回一个与基类类型一致的数组
ndmin 生成指定数组的最小维度

下面提供一些示例方便理解:

复制代码
 import numpy as np

    
  
    
 # 创建一个一维数组
    
 a = np.array([1,2,3])  
    
 print (a)  # [1 2 3]
    
  
    
 # 多于一个维度  
    
 a = np.array([[1,  2],  [3,  4]])  
    
 print (a)  
    
 # [[1  2] 
    
 # [3  4]]
    
  
    
 # 最小维度  
    
 a = np.array([1, 2, 3, 4, 5], ndmin =  2)  
    
 print (a)  # [[1 2 3 4 5]]
    
  
    
 # dtype 参数  
    
 a = np.array([1,  2,  3], dtype = complex)  
    
 print (a)  # [1.+0.j 2.+0.j 3.+0.j]
    
    
    
    
    代码解读

数组的基本属性:

属性 含义
ndarray.ndim 数组的维度
ndarray.shape 数组的维度大小,返回一个元组。 对于n行m列的数组维度大小为(n,m)
ndarray.size 数组中元素的总数等于行乘列
ndarray.dtype 数组的元素类型(可指定元素类型)
ndarray.itemsize 数组中每个元素的大小(以字节为单位)
ndarray.data 生成指向数组首地址的一个memoryview对象

创建一个 ndarray 只需调用 NumPy 的 array 函数即可:

复制代码
 import numpy as np

    
  
    
 a = np.array([0, 1, 2, 3, 4])
    
 # [0 1 2 3 4]
    
 """
    
 使用array函数时传递一个序列生成数组,若传递多层嵌套序列则创建一个多维数组
    
 NumPy会为新创建的数组推断一个合适的数据类型并且该参数会保存在dtype中
    
 """
    
 a.ndim  # 返回数组的维度结果为1
    
 a.shape  # 返回数组维度的大小结果为(5,)
    
 a.size  # 返回数组中元素总数结果为5
    
 a.dtype  # 返回数组元素类型结果为int32
    
 a.itemsize  # 返回数组元素的大小结果为4(字节)
    
 a.data  # 返回指向首地址的指针
    
  
    
 a = np.array((0, 1, 2, 3, 4))
    
 # [0 1 2 3 4]
    
 a = np.arange(5)
    
 # [0 1 2 3 4]
    
 a = np.linspace(0, 2*np.pi, 5)
    
 # [ 0.          1.57079633  3.14159265  4.71238898  6.28318531] 以均匀步长生成数字序列
    
  
    
 # 可以通过astype()方法转换为元素类型
    
 arr = np.array([1, 2, 3; 4, 5, 6], dtype = np.float64)  # 指定元素类型为float64型
    
 arr.astype(np.str_)  # 转换元素类型为Unicode
    
 # 输出为array(['1.0', '2.0', '3.0', '4.0', '5.0', '6.0'], dtype='<U32')
    
  
    
    
    
    
    代码解读

reshape() 函数~数组变维

复制代码
 imoprt numpy as np

    
  
    
 # reshape(x,y)函数第一个参数是想要转换成的行数第二个参数是想要转换成的列数
    
  
    
 a = np.array([[1,2],[2,3],[3,4]])  # a是一个三行两列的数组
    
 print(a)
    
 b = a.reshape(2,3)  # 通过reshape函数变为了两行三列的数组
    
 print(b)
    
 #a
    
 #[[1 2]
    
 #[3 4]
    
 #[5 6]]
    
  
    
 #b
    
 #[[1 2 3]
    
 #[4 5 6]]
    
    
    
    
    代码解读

NumPy数据类型

NumPy 作为 Python 的扩展包,它提供了比 Python 更加丰富的数据类型。

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 位浮点数(实数部分和虚数部分)
str_ 表示字符串类型
string_ 表示字节串类型

数据类型对象(dtype)

数据类型的代称也被称作dtype对象,在数据分析领域主要用于表征数组元素的数据类型、存储规模以及字节排列模式。此外,在构建复杂数据架构方面也发挥着重要作用。A variety of standard data types such as int64 and float32 exemplify this concept.

- 数据的具体形式包括整数值、浮点数值以及Python中的对象类型。
- 具体存储信息如整数占用多少个字节。
- 涉及的数据布局包括小端顺序和大端顺序两种情况。
- 对于具有明确结构的数据来说,

  • 详细信息包括字段名称、每种字段的数据类型以及它们占用内存块的具体情况。
  • 当数据形式为子数组时,
    • 包含子数组的具体形状及其对应的存储格式。

字节顺序是通过预先在数据类型中指定 < 或 > 来确定的。< 则表示小端存储方式(最小值位于最低地址位置,并依次排列于较低地址位置)。> 则代表大端存储方式(最高有效位位于最低地址位置,并依次排列于较高地址位置)。

dtype语法

复制代码
    numpy.dtype(object, align, copy)
    
    代码解读

- object - 要转换为的数据类型对象

- align - 如果为True,填充字段使其类似C的结构体

- copy - 复制dtype对象,如果为False,则是对内饰数据类型对象的引用

复制代码
 import numpy as np

    
 # 使用标量类型
    
 a1 = np.dtype(np.int32)
    
 print(a1)  # int32
    
  
    
 # int8, int16, int32, int64 四种数据类型可以使用字符串 'i1', 'i2','i4','i8' 代替
    
 a2 = np.dtype('i4')
    
 print(a2)  # int32
    
  
    
 # 将数据类型应用于 ndarray 对象
    
 a3 = np.dtype([('age',np.int8)]) 
    
 a4 = np.array([(10,),(20,),(30,)], dtype = a3) 
    
 print(a)  # [(10,) (20,) (30,)]
    
  
    
 # 类型字段名可以用于存取实际的 age 列
    
 a5 = np.dtype([('age',np.int8)]) 
    
 a6 = np.array([(10,),(20,),(30,)], dtype = a5) 
    
 print(a['age'])  # [10 20 30]
    
  
    
 # 定义一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 marks,并将这个 # dtype 应用到 ndarray 对象。
    
 student = np.dtype([('name','S20'), ('age', 'i1'), ('marks', 'f4')]) 
    
 a = np.array([('abc', 21, 50),('xyz', 18, 75)], dtype = student) 
    
 print(a)  # [('abc', 21, 50.0), ('xyz', 18, 75.0)]
    
  
    
  
    
 # 数组的 dtype 为 int8(一个字节)(ndarray.itemsize 以字节的形式返回数组中每一个元素的大小。)
    
 x = np.array([1,2,3,4,5], dtype = np.int8)  
    
 print (x.itemsize)  # 1
    
  
    
 # 数组的 dtype 现在为 float64(八个字节) 
    
 y = np.array([1,2,3,4,5], dtype = np.float64)  
    
 print (y.itemsize)  # 8
    
    
    
    
    代码解读

数据类型标识码

NumPy中每种数据类型都有一个唯一标识的字符码,如下图所示:

标识码表

字符 对应类型
b 代表布尔型
i 带符号整型
u 无符号整型
f 浮点型
c 复数浮点型
m 时间间隔(timedelta)
M datatime(日期时间)
O Python对象
S,a 字节串(S)与字符串(a)
U Unicode
V 原始数据(void)

创建ndarray数组

创建 ndarray 数组的方法

除了使用 array() 方法外,NumPy 还提供了其他创建 ndarray 数组的方法。

numpy.empty

numpy.empty 用于生成一个具有指定形状(shape)、数据类型(dtype)且未预先赋值的数组:

复制代码
    numpy.empty(shape, dtype = float, order = 'C')
    
    代码解读
参数 描述
shape 数组形状
dtype 数据类型,可选
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
复制代码
 import numpy as np

    
 arr = np.empty((2.3), dtype = int, order = 'F') 
    
 print(arr) 
    
 """
    
 输出结果为:
    
 [[1740919781 1699243488]
    
  [     12290          0]
    
  [         0          0]]
    
 数组元素是内存随机给的值,因为未被初始化
    
 """
    
    
    
    
    代码解读

numpy.zeros

创建指定大小的数组,数组元素以 0 来填充:

复制代码
 numpy.zeros(shape, dtype = float, order = 'C')

    
 # 参数说明同上
    
    
    
    
    代码解读
复制代码
 import numpy as np

    
  
    
 # 默认为浮点数
    
 x = np.zeros(5) 
    
 print(x)  # [0. 0. 0. 0. 0.]  (行)(中间有空格隔开)
    
  
    
 # 设置类型为整数
    
 y = np.zeros((5,), dtype = np.int) 
    
 print(y)  # [0 0 0 0 0]  (行)(中间有空格隔开)
    
  
    
 # 自定义类型
    
 z = np.zeros((2,2), dtype = [('x', 'i4'), ('y', 'i4')])  
    
 print(z)
    
 """
    
 结果为:
    
 [[(0, 0) (0, 0)]
    
  [(0, 0) (0, 0)]]
    
 """
    
    
    
    
    代码解读

numpy.ones

创建指定形状的数组,数组元素以 1 来填充:

复制代码
    numpy.ones(shape, dtype = None, order = 'C')
    
    代码解读
复制代码
 import numpy as np

    
  
    
 # 默认为浮点数
    
 x = np.ones(5) 
    
 print(x)  # [1. 1. 1. 1. 1.]
    
  
    
  
    
 # 自定义类型
    
 x = np.ones([2,2], dtype = int)
    
 print(x)
    
 """
    
 [[1 1]
    
  [1 1]]
    
 """
    
    
    
    
    代码解读

numpy.full

返回给定维度和类型的新数组,填充 fill_value。

复制代码
    numpy.full(shape, fill_value, dtype=None, order='C')
    
    代码解读
参数 描述
shape 返回数组为度
fill_value 填充值
dtype 返回数组的数据类型,默认值 None 指:np.array(fill_value).dtype
order 有"C"和"F"两个选项,分别代表,行优先和列优先,在计算机内存中的存储元素的顺序。
复制代码
 import numpy as np

    
 a = np.full((2, 3), 7)
    
 print(a)
    
 """
    
 [[7 7 7]
    
  [7 7 7]]
    
 """
    
    
    
    
    代码解读

NumPy 从已有的数组创建数组

numpy.asarray

numpy.asarray类似于 numpy.array,在参数数量上有所区别:numpy.asarray仅限于三个参数,在功能上少于 numpy.array。

复制代码
 numpy.asarray(a, dtype = None, order = None)

    
 numpy.array(object, dtype = None, copy = Ture, order = None, subok = False, ndmin = 0)
    
    
    
    
    代码解读
复制代码
 import numpy as np

    
  
    
 x =  [1,2,3]  # 或者是一个元组 x =  (1,2,3)  # 也可以是一个元组列表 x =  [(1,2,3),(4,5)]  
    
 a = np.asarray(x)  # 或者你可以加dtype参数:a = np.asarray(x, dtype =  float)  
    
 print (a)
    
    
    
    
    代码解读

numpy.frombuffer

numpy.frombuffer 用于生成可变数组。它接收缓冲区输入参数,并通过以流式的方式读取数据来转换为 ndarray 对象。

复制代码
    numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
    
    代码解读

注意: buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。

参数 描述
buffer 可以是任意对象,会以流的形式读入。
dtype 返回数组的数据类型,可选
count 读取的数据数量,默认为-1,读取所有数据。
offset 读取的起始位置,默认为0。
复制代码
 import numpy as np

    
  
    
 a = np.frombuffer(b'Hello World', dtype='S1')
    
 print(a)  # [b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']
    
    
    
    
    代码解读
复制代码
 import numpy as np

    
 import array
    
  
    
 a = array.array('i', [1, 2, 3, 4])
    
 print(a)
    
  
    
 na = np.frombuffer(a, dtype=np.int_)  # 数据值会动态改变
    
 print(na)
    
  
    
 a[0] = 10
    
 print(a)
    
 print(na)
    
  
    
 """四个输出
    
 array('i', [1, 2, 3, 4])
    
 [1 2 3 4]
    
 array('i', [10, 2, 3, 4])
    
 [10  2  3  4]
    
 """
    
    
    
    
    代码解读

该存储空间具有连续性特征,在Python list类型中不具备类似功能。可以通过调用numpy.frombuffer方法来获取该存储空间内的数据。通过观察上述操作过程可知,在修改原始array.array元素值时会同步更新相关数据。值得注意的是,在这种情况下无法追加新的元素至原始数据结构。

复制代码
 import numpy as np

    
 import array
    
  
    
 a = array.array("i", [1, 2, 3, 4])
    
 na = np.frombuffer(a, dtype=int)
    
 print(na)
    
  
    
 a.append(5)
    
 print(na)
    
  
    
 """
    
 输出为
    
 [1 2 3 4]
    
 [140896288       381         3         4]  # 出错啦!
    
 """
    
    
    
    
    代码解读

numpy.fromiter

numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。

复制代码
    numpy.fromiter(iterable, dtype, count=-1)
    
    代码解读
参数 描述
iterable 可迭代对象
dtype 返回数组的数据类型
count 读取的数据数量,默认为-1,读取所有数据
复制代码
 import numpy as np

    
  
    
 # 使用 range 函数创建列表对象  
    
 list=range(5)
    
 it=iter(list)
    
  
    
 # 使用迭代器创建 ndarray 
    
 x=np.fromiter(it, dtype=float)
    
 print(x)  # 结果是 [0. 1. 2. 3. 4.]
    
    
    
    
    代码解读

看起来有点像 numpy.arrayarray 方法接受的是一个列表类型参数;而 fromiter 则可以接受可迭代的对象。

复制代码
 import numpy as np

    
  
    
 iterable = (x * x for x in range(5))
    
 a = np.array(iterable)
    
 print(a)  # 结果是 <generator object <genexpr> at 0x000000001442DD00>
    
    
    
    
    代码解读

对于这些示例内容,请从我的资源库中获取一个seaborn基础数据集的.zip文件。具体操作步骤是将解压后的文件放置于C:{User}\Python Files位置。

参考文献:

[NumPy官方中文文档https://www.numpy.org.cn/

NumPy官方正统中文电子文档 https://www.numpy.org.cn/](https://www.numpy.org.cn/ "NumPy官方中文文档https://www.numpy.org.cn/")

[菜鸟教程https://www.runoob.com/

https://www.runoob.com/](https://www.runoob.com/ "菜鸟教程https://www.runoob.com/")

[c语言中文网http://c.biancheng.net/

该网页提供c语言学习资源导航

全部评论 (0)

还没有任何评论哟~