Python3快速入门(十二)——NumPy

本文详细介绍了Python3中的NumPy库,包括NumPy的安装、数据类型、ndarray对象及其属性、数组创建与索引、数组迭代、条件运算、统计函数、算术运算、矩阵运算、位运算、字符串处理、数学函数、排序过滤、字节交换、副本与视图,以及矩阵模块和线性代数模块的功能。NumPy是Python科学计算的基础库,提供了高效的多维数组对象和丰富的数学函数库,广泛应用于数据分析和机器学习领域。
摘要由CSDN通过智能技术生成

Python3快速入门(十二)——NumPy

一、NumPy简介

1、NumPy简介

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,同时对数组运算提供了大量的数学函数库。
Numpy 是一个运行速度非常快的数学库,内部解除了CPython的GIL(全局解释器锁),运行效率极好,主要用于数组计算,是大量机器学习框架的基础库,NumPy主要包括如下:
(1)强大的N维数组对象 ndarray
(2)广播功能函数
(3)整合 C/C++/Fortran 代码的工具
(4)线性代数、傅里叶变换、随机数生成等功能。
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)组合使用,用于替代 MatLab。

2、NumPy的优缺点

NumPy优点如下:
(1)对于同样的数值计算任务,使用NumPy要比直接编写Python代码便捷得多。
(2)NumPy中的数组的存储效率和输入输出性能均远远优于Python中等价的基本数据结构,且其能够提升的性能是与数组中的元素成比例的。
(3)NumPy的大部分代码都是用C语言写的,其底层算法在设计时就有着优异的性能,这使得NumPy比纯Python代码高效得多
NumPy缺点如下:
由于NumPy使用内存映射文件以达到最优的数据读写性能,而内存的大小限制了其对TB级大文件的处理;NumPy数组的通用性不及Python提供的list容器。

3、NumPy安装

pip install --user numpy
--user 选项可以设置只安装在当前的用户下,而不是写入到系统目录。

4、NumPy数据类型

numpy支持的数据类型比 Python 内置的类型要多,基本上可以和 C 语言的数据类型对应上,其中部分类型对应为 Python 内置的类型。
bool_ 布尔型数据类型(True 或者 False)
int_ 默认的整数类型(类似于 C 语言中的 long,int32 或 int64)
intc 与 C 的 int 类型一样,一般是 int32 或 int 64
intp 用于索引的整数类型(类似于 C 的 ssizet,通常是int32或 int64)
int8 字节(-128 to 127)
int16 整数(-32768 to 32767)
int32 整数(-2147483648 to 2147483647)
int64 整数(64bit)
uint8 无符号整数(0 to 255)
uint16 无符号整数(0 to 65535)
uint32 无符号整数(0 to 4294967295)
uint64 无符号整数(0 to 18446744073709551615)
`float
float64 类型的简写<br/>float16 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位<br/>float64 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位<br/>float64 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位<br/>complex_` complex128 类型的简写,即 128 位复数
complex64 复数,表示双 32 位浮点数(实数部分和虚数部分)
complex128 复数,表示双 64 位浮点数(实数部分和虚数部分)
每个内建类型都有一个唯一定义它的字符代码:
b 布尔类型
i 有符号整型
u 无符号整型
f 浮点型
c 复数浮点型
m 时间间隔
M 日期间隔
O Python对象
S,a byte字符串
U Unicode
V 原始数据(void)

5、dtype数据类型对象

数据类型对象dtype用于描述与数组对应的内存区域如何使用,依赖如下几个方面:
数据的类型(整数,浮点数或者 Python 对象)
数据的大小(例如, 整数使用多少个字节存储)
数据的字节顺序(小端法或大端法)
在结构化类型的情况下,字段的名称、每个字段的数据类型和每个字段所取的内存块的部分
如果数据类型是子数组,它的形状和数据类型
字节顺序是通过对数据类型预先设定"<"或">"来决定的。"<"意味着小端法(最小值存储在最小的地址,即低位组放在最前面)。">"意味着大端法(最重要的字节存储在最小的地址,即高位组放在最前面)。
dtype 对象是使用以下语法构造的:
numpy.dtype(object, align, copy)
object - 要转换为的数据类型对象
align - 如果为 true,填充字段使其类似 C 的结构体。
copy - 复制 dtype 对象 ,如果为 false,则是对内置数据类型对象的引用
一个结构化数据类型 student,包含字符串字段 name,整数字段 age,及浮点字段 score,并将 dtype 应用到 ndarray 对象。

import numpy

if __name__ == "__main__":
    student = numpy.dtype([("name", "S20"), ("age", numpy.int8), ("marks", "<f4")])
    student_array = numpy.array([("Bauer", 22, 88), ("Jack", 21, 90), ("Alex", 78, 22)], dtype=student)
    print(student_array)

# output:
# [(b'Bauer', 22, 88.) (b'Jack', 21, 90.) (b'Alex', 78, 22.)]

二、ndarray

1、ndarray简介

ndarray是NumPy的核心,ndarray封装了python原生的同数据类型的n维数组,通过正整数元组索引。
ndarray内部结构如下:
(1)一个指向数据(内存或内存映射文件中的一块数据)的指针。
(2)数据类型(dtype),描述在数组中的固定大小值的格子。
(3)一个表示数组形状(shape)的元组,表示各维度大小的元组。
(4)一个跨度元组(stride),其中的整数指的是为了前进到当前维度下一个元素需要"跨过"的字节数。
Python3快速入门(十二)——NumPy
ndarray 和 标准Python 数组的区别如下:
(1)ndarray 在创建时具有固定的大小, 更改ndarray的大小将创建一个新数组并删除原来的数组,与Python的原生数组对象(可以动态增长)不同。。
(2)ndarray 中的元素必须具有相同的数据类型,因此在内存中的大小相同。
(3)ndarray 有助于对大量数据进行高级数学和其它类型的操作。 通常,这些操作的执行效率更高,比使用Python原生数组的代码更少。
(4)大部分基于Python的科学和数学软件包都使用NumPy数组,尽管通常也支持Python原生数组作为参数,但在处理前仍然会将输入数组转换为NumPy数组,而且通常输出为NumPy数组。为了高效地使用当今基于Python的科学计算工具,需要知道如何使用NumPy数组。

2、ndarray 对象的属性

ndarray 对象提供的关键属性如下:
ndarray.ndim:数组的轴(维度)的个数,维度的数量被称为rank。
ndarray.shape:数组的维度,是一个整数的元组,表示每个维度中数组的大小。对于n行和m列的矩阵,shape是(n,m)。因此,shape元组的长度就是rank或维度的个数 ndim。
ndarray.size:数组元素的总数,等于shape的元素的乘积。
ndarray.dtype:描述数组中元素类型的对象。可以使用标准的Python类型创建或指定dtype。NumPy提供自己的类型,如numpy.int32、numpy.int16和numpy.float64。
ndarray.itemsize:数组中每个元素的字节大小,等于 ndarray.dtype.itemsize。元素为 float64 类型的数组的 itemsize 为8(=64/8),而 complex32 类型的数组的 itemsize 为4(=32/8)。
ndarray.flags:ndarray对象的内存信息。
ndarray.real:ndarray元素的实部
ndarray.imag:ndarray 元素的虚部
ndarray.data:缓冲区包含数组的实际元素。
Ndarray.flags的内存信息属性如下:
C_CONTIGUOUS (C):数据是在一个单一的C风格的连续段中
F_CONTIGUOUS (F):数据是在一个单一的Fortran风格的连续段中
OWNDATA (O):数组拥有自己所使用的内存或从另一个对象中借用
WRITEABLE (W:)数据区域可以被写入,将值设置为 False,则数据为只读。
ALIGNED (A):数据和所有元素都适当地对齐到硬件上
UPDATEIFCOPY (U):数组是其它数组的一个副本,当数组被释放时,原数组的内容将被更新

import numpy

if __name__ == "__main__":
    a = numpy.arange(15).reshape(5, 3)
    print(a)
    print("shape: ", a.shape)
    print("ndim:", a.ndim)
    print("dtype:", a.dtype.name)
    print("itemsize: ", a.itemsize)
    print("itemsize: ", a.dtype.itemsize)
    print("size: ", a.size)
    print("flags: ", a.flags)
    print("data: ", a.data)
    print("type:", type(a))

# output:
# [[ 0  1  2]
#  [ 3  4  5]
#  [ 6  7  8]
#  [ 9 10 11]
#  [12 13 14]]
# shape:  (5, 3)
# ndim: 2
# dtype: int64
# itemsize:  8
# itemsize:  8
# size:  15
# flags:    C_CONTIGUOUS : True
#   F_CONTIGUOUS : False
#   OWNDATA : False
#   WRITEABLE : True
#   ALIGNED : True
#   WRITEBACKIFCOPY : False
#   UPDATEIFCOPY : False
# data:  <memory at 0x7f1b6fbf4b40>
# type: <class 'numpy.ndarray'>

3、创建数组

numpy.empty(shape, dtype = float, order = 'C')
numpy.empty 方法用来创建一个指定形状(shape)、数据类型(dtype)且未初始化的数组。

import numpy

if __name__ == "__main__":
    array_empty = numpy.empty([2, 3])
    print(array_empty)

# output:
# [[6.92184835e-310 1.23016891e-316 6.92184893e-310]
#  [6.92184893e-310 1.45897537e-303 2.72466824e-311]]

numpy.array(p_object, dtype=None, copy=True, order='K', subok=False, ndmin=0)
创建数组,p_object为数组或序列,dtype为数组元素类型

import numpy

if __name__ == "__main__":
    a = numpy.array([[1, 2, 3], [4, 5, 6]], numpy.int)
    print(a)
# output:
# [[1 2 3]
#  [4 5 6]]

numpy.asarray(a, dtype = None, order = None)
创建数组,a为数组或序列,dtype为数组元素类型

import numpy

if __name__ == "__main__":
    array_as = numpy.asarray([[1, 2, 3, 4], [5, 6, 7, 8]])
    print(array_as)

# output:
# [[1 2 3 4]
#  [5 6 7 8]]

numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
numpy.frombuffer 用于实现动态数组。
buffer 参数为人以对象,以流的形式读入转化成 ndarray 对象。buffer 是字符串的时候,Python3 默认 str 是 Unicode 类型,所以要转成 bytestring 在原 str 前加上 b。
dtype参数,数组的数据类型,可选。
count参数,读取的数据量,默认为-1,读取所有的数据。
offset参数,读取的起始位置,默认为0。

import numpy

if __name__ == "__main__":
    s = b"Hello, Python"
    a = numpy.frombuffer(s, dtype="S1")
    print(a)

# output:
# [b'H' b'e' b'l' b'l' b'o' b',' b' ' b'P' b'y' b't' b'h' b'o' b'n']

numpy.fromiter(iterable, dtype, count=-1)
numpy.fromiter 方法从可迭代对象中建立 ndarray 对象,返回一维数组。
Iterable参数,可迭代对象。
dtype参数,数组的数据类型,可选。
count参数,读取的数据数量,默认为-1,读取所有数据。

import numpy

if __name__ == "__main__":
    # 使用 range 函数创建列表对象
    l = range(10)
    it = iter(l)
    # 使用迭代器创建 ndarray
    x = numpy.fromiter(it, dtype=float)
    print(x)

# output:
# [0. 1. 2. 3. 4. 5. 6. 7. 8. 9.]

numpy.ones(shape, dtype=None, order='C')
创建数值为1的数组,shape是数组的形状,dtype是数值类型。

import numpy

if __name__ == "__main__":
    array_ones = numpy.ones((2, 3), numpy.int)
    print(array_ones)
# output:
# [[1 1 1]
#  [1 1 1]]

numpy.zeros(shape, dtype=None, order='C')
创建数值为0的数组,shape是数组的形状,dtype是数值类型。

import numpy

if __name__ == "__main__":
    array_zeros = numpy.zeros((2, 3), numpy.int)
    print(array_zeros)
# output:
# [[0 0 0]
#  [0 0 0]]

numpy.full(shape, fill_value, dtype=None, order='C')

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值