【Python核武器】:Numpy深度攻略!(一)
off999 2024-12-14 14:26 19 浏览 0 评论
NumPy - 简介
NumPy 是一个 Python 包。 它代表 “Numeric Python”。 它是一个由多维数组对象和用于处理数组的例程集合组成的库。
Numeric,即 NumPy 的前身,是由 Jim Hugunin 开发的。 也开发了另一个包 Numarray ,它拥有一些额外的功能。 2005年,Travis Oliphant 通过将 Numarray 的功能集成到 Numeric 包中来创建 NumPy 包。 这个开源项目有很多贡献者。
NumPy 操作
使用NumPy,开发人员可以执行以下操作:
- 数组的算数和逻辑运算。
- 傅立叶变换和用于图形操作的例程。
- 与线性代数有关的操作。 NumPy 拥有线性代数和随机数生成的内置函数。
NumPy – MatLab 的替代之一
NumPy 通常与 SciPy(Scientific Python)和 Matplotlib(绘图库)一起使用。 这种组合广泛用于替代 MatLab,是一个流行的技术计算平台。 但是,Python 作为 MatLab 的替代方案,现在被视为一种更加现代和完整的编程语言。
NumPy 是开源的,这是它的一个额外的优势。
NumPy - Ndarray 对象
NumPy 中定义的最重要的对象是称为 ndarray 的 N 维数组类型。 它描述相同类型的元素集合。 可以使用基于零的索引访问集合中的项目。
ndarray中的每个元素在内存中使用相同大小的块。 ndarray中的每个元素是数据类型对象的对象(称为 dtype)。
从ndarray对象提取的任何元素(通过切片)由一个数组标量类型的 Python 对象表示。 下图显示了ndarray,数据类型对象(dtype)和数组标量类型之间的关系。
Ndarray
ndarray类的实例可以通过本教程后面描述的不同的数组创建例程来构造。 基本的ndarray是使用 NumPy 中的数组函数创建的,如下所示:
 
numpy.array 
 它从任何暴露数组接口的对象,或从返回数组的任何方法创建一个ndarray。
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
上面的构造器接受以下参数:
| 序号 | 参数及描述 | 
| 1. | object 任何暴露数组接口方法的对象都会返回一个数组或任何(嵌套)序列。 | 
| 2. | dtype 数组的所需数据类型,可选。 | 
| 3. | copy 可选,默认为true,对象是否被复制。 | 
| 4. | order C(按行)、F(按列)或A(任意,默认)。 | 
| 5. | subok 默认情况下,返回的数组被强制为基类数组。 如果为true,则返回子类。 | 
| 6. | ndmin 指定返回数组的最小维数。 | 
看看下面的例子来更好地理解。
示例 1
 
import numpy as np 
a = np.array([1,2,3])  
print a输出如下:
[1, 2, 3]
示例 2
 
# 多于一个维度  
import numpy as np 
a = np.array([[1,  2],  [3,  4]])  
print a输出如下
[[1, 2] 
 [3, 4]]
 示例 3
 
# 最小维度  
import numpy as np 
a = np.array([1,  2,  3,4,5], ndmin =  2)  
print a输出如下:
[[1, 2, 3, 4, 5]]
 示例 4
 
# dtype 参数  
import numpy as np 
a = np.array([1,  2,  3], dtype = complex)  
print a输出如下:
[ 1.+0.j,  2.+0.j,  3.+0.j]
 **ndarray ** 对象由计算机内存中的一维连续区域组成,带有将每个元素映射到内存块中某个位置的索引方案。 内存块以按行(C 风格)或按列(FORTRAN 或 MatLab 风格)的方式保存元素。
NumPy - 数据类型
NumPy 支持比 Python 更多种类的数值类型。 下表显示了 NumPy 中定义的不同标量数据类型。
| 序号 | 数据类型及描述 | 
| 1. | bool_ 存储为一个字节的布尔值(真或假) | 
| 2. | int_ 默认整数,相当于 C 的long,通常为int32或int64 | 
| 3. | intc 相当于 C 的int,通常为int32或int64 | 
| 4. | intp 用于索引的整数,相当于 C 的size_t,通常为int32或int64 | 
| 5. | int8 字节(-128 ~ 127) | 
| 6. | int16 16 位整数(-32768 ~ 32767) | 
| 7. | int32 32 位整数(-2147483648 ~ 2147483647) | 
| 8. | int64 64 位整数(-9223372036854775808 ~ 9223372036854775807) | 
| 9. | uint8 8 位无符号整数(0 ~ 255) | 
| 10. | uint16 16 位无符号整数(0 ~ 65535) | 
| 11. | uint32 32 位无符号整数(0 ~ 4294967295) | 
| 12. | uint64 64 位无符号整数(0 ~ 18446744073709551615) | 
| 13. | float_ float64的简写 | 
| 14. | float16 半精度浮点:符号位,5 位指数,10 位尾数 | 
| 15. | float32 单精度浮点:符号位,8 位指数,23 位尾数 | 
| 16. | float64 双精度浮点:符号位,11 位指数,52 位尾数 | 
| 17. | complex_ complex128的简写 | 
| 18. | complex64 复数,由两个 32 位浮点表示(实部和虚部) | 
| 19. | complex128 复数,由两个 64 位浮点表示(实部和虚部) | 
NumPy 数字类型是dtype(数据类型)对象的实例,每个对象具有唯一的特征。 这些类型可以是np.bool_,np.float32等。
数据类型对象 (dtype)
数据类型对象描述了对应于数组的固定内存块的解释,取决于以下方面:
- 数据类型(整数、浮点或者 Python 对象)
- 数据大小
- 字节序(小端或大端)
- 在结构化类型的情况下,字段的名称,每个字段的数据类型,和每个字段占用的内存块部分。
- 如果数据类型是子序列,它的形状和数据类型。
字节顺序取决于数据类型的前缀<或>。 <意味着编码是小端(最小有效字节存储在最小地址中)。 >意味着编码是大端(最大有效字节存储在最小地址中)。
dtype可由以下语法构造:
numpy.dtype(object, align, copy)
 参数为:
- Object:被转换为数据类型的对象。
- Align:如果为true,则向字段添加间隔,使其类似 C 的结构体。
- Copy ? 生成dtype对象的新副本,如果为flase,结果是内建数据类型对象的引用。
示例 1
 
# 使用数组标量类型  
import numpy as np 
dt = np.dtype(np.int32)  
print dt输出如下:
int32
示例 2
 
#int8,int16,int32,int64 可替换为等价的字符串 'i1','i2','i4',以及其他。  
import numpy as np 
 
dt = np.dtype('i4')  
print dt 输出如下:
int32
 示例 3
 
# 使用端记号  
import numpy as np 
dt = np.dtype('>i4')  
print dt输出如下:
>i4
 下面的例子展示了结构化数据类型的使用。 这里声明了字段名称和相应的标量数据类型。
示例 4
 
# 首先创建结构化数据类型。  
import numpy as np 
dt = np.dtype([('age',np.int8)])  
print dt 输出如下:
[('age', 'i1')] 
 示例 5
 
# 现在将其应用于 ndarray 对象  
import numpy as np 
 
dt = np.dtype([('age',np.int8)]) 
a = np.array([(10,),(20,),(30,)], dtype = dt)  
print a输出如下:
[(10,) (20,) (30,)]
 示例 6
 
# 文件名称可用于访问 age 列的内容  
import numpy as np 
 
dt = np.dtype([('age',np.int8)]) 
a = np.array([(10,),(20,),(30,)], dtype = dt)  
print a['age']输出如下:
[10 20 30]
 示例 7
以下示例定义名为 student 的结构化数据类型,其中包含字符串字段name,整数字段age和浮点字段marks。 此dtype应用于ndarray对象。
 
import numpy as np 
student = np.dtype([('name','S20'),  ('age',  'i1'),  ('marks',  'f4')])  
print student输出如下:
[('name', 'S20'), ('age', 'i1'), ('marks', '<f4')])
 示例 8
 
import numpy as np 
 
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)]
 每个内建类型都有一个唯一定义它的字符代码:
- 'b':布尔值
- 'i':符号整数
- 'u':无符号整数
- 'f':浮点
- 'c':复数浮点
- 'm':时间间隔
- 'M':日期时间
- 'O':Python 对象
- 'S', 'a':字节串
- 'U':Unicode
- 'V':原始数据(void)
NumPy - 数组属性
这一章中,我们会讨论 NumPy 的多种数组属性。
ndarray.shape
这一数组属性返回一个包含数组维度的元组,它也可以用于调整数组大小。
示例 1
 
import numpy as np 
a = np.array([[1,2,3],[4,5,6]])  
print a.shape输出如下:
(2, 3)
示例 2
 
# 这会调整数组大小  
import numpy as np 
 
a = np.array([[1,2,3],[4,5,6]]) a.shape =  (3,2)  
print a 输出如下:
[[1, 2] 
 [3, 4] 
 [5, 6]]
 示例3
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]]
 ndarray.ndim
这一数组属性返回数组的维数。
示例 1
 
# 等间隔数字的数组  
import numpy as np 
a = np.arange(24)  print a输出如下:
[0 1  2  3  4  5  6  7  8  9  10  11  12  13  14  15  16 17 18 19 20 21 22 23] 
示例2
 
# 一维数组  
import numpy as np 
a = np.arange(24) a.ndim 
# 现在调整其大小
b = a.reshape(2,4,3)  
print b 
# b 现在拥有三个维度输出如下:
[[[ 0,  1,  2] 
  [ 3,  4,  5] 
  [ 6,  7,  8] 
  [ 9, 10, 11]]  
  [[12, 13, 14] 
   [15, 16, 17]
   [18, 19, 20] 
   [21, 22, 23]]] 
 numpy.itemsize
这一数组属性返回数组中每个元素的字节单位长度。
示例 1
 
# 数组的 dtype 为 int8(一个字节)  
import numpy as np 
x = np.array([1,2,3,4,5], dtype = np.int8)  
print x.itemsize输出如下:
示例 2
 
# 数组的 dtype 现在为 float32(四个字节)  
import numpy as np 
x = np.array([1,2,3,4,5], dtype = np.float32)  
print x.itemsize输出如下:
4
numpy.flags
ndarray对象拥有以下属性。这个函数返回了它们的当前值。
| 序号 | 属性及描述 | 
| 1. | C_CONTIGUOUS (C) 数组位于单一的、C 风格的连续区段内 | 
| 2. | F_CONTIGUOUS (F) 数组位于单一的、Fortran 风格的连续区段内 | 
| 3. | OWNDATA (O) 数组的内存从其它对象处借用 | 
| 4. | WRITEABLE (W) 数据区域可写入。 将它设置为flase会锁定数据,使其只读 | 
| 5. | ALIGNED (A) 数据和任何元素会为硬件适当对齐 | 
| 6. | UPDATEIFCOPY (U) 这个数组是另一数组的副本。当这个数组释放时,源数组会由这个数组中的元素更新 | 
示例
下面的例子展示当前的标志。
 
import numpy as np 
x = np.array([1,2,3,4,5])  
print x.flags输出如下:
 
C_CONTIGUOUS : True 
F_CONTIGUOUS : True 
OWNDATA : True 
WRITEABLE : True 
ALIGNED : True 
UPDATEIFCOPY : False
 NumPy - 数组创建例程
新的ndarray对象可以通过任何下列数组创建例程或使用低级ndarray构造函数构造。
numpy.empty
它创建指定形状和dtype的未初始化数组。 它使用以下构造函数:
numpy.empty(shape, dtype = float, order = 'C')
 构造器接受下列参数:
| 序号 | 参数及描述 | 
| 1. | Shape 空数组的形状,整数或整数元组 | 
| 2. | Dtype 所需的输出数组类型,可选 | 
| 3. | Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组 | 
示例
下面的代码展示空数组的例子:
 
import numpy as np 
x = np.empty([3,2], dtype =  int)  
print x输出如下:
[[22649312    1701344351] 
 [1818321759  1885959276] 
 [16779776    156368896]]
 注意:数组元素为随机值,因为它们未初始化。
numpy.zeros
返回特定大小,以 0 填充的新数组。
numpy.zeros(shape, dtype = float, order = 'C')
构造器接受下列参数:
| 序号 | 参数及描述 | 
| 1. | Shape 空数组的形状,整数或整数元组 | 
| 2. | Dtype 所需的输出数组类型,可选 | 
| 3. | Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组 | 
示例 1
 
# 含有 5 个 0 的数组,默认类型为 float  
import numpy as np 
x = np.zeros(5)  
print x输出如下:
[ 0.  0.  0.  0.  0.]
 示例2
 
import numpy as np 
x = np.zeros((5,), dtype = np.int)  
print x输出如下:
[0  0  0  0  0]
 示例3
 
# 自定义类型 
import numpy as np 
x = np.zeros((2,2), dtype =  [('x',  'i4'),  ('y',  'i4')])  
print x输出如下:
[[(0,0)(0,0)]
 [(0,0)(0,0)]]         
 numpy.ones
返回特定大小,以 1 填充的新数组。
 numpy.ones(shape, dtype = None, order = 'C')构造器接受下列参数:
| 序号 | 参数及描述 | 
| 1. | Shape 空数组的形状,整数或整数元组 | 
| 2. | Dtype 所需的输出数组类型,可选 | 
| 3. | Order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组 | 
示例 1
 
# 含有 5 个 1 的数组,默认类型为 float  
import numpy as np 
x = np.ones(5)  print x输出如下:
[ 1.  1.  1.  1.  1.]
 示例2
 
import numpy as np 
x = np.ones([2,2], dtype =  int)  
print x输出如下:
[[1  1] 
 [1  1]]
 NumPy - 来自现有数据的数组
这一章中,我们会讨论如何从现有数据创建数组。
numpy.asarray
此函数类似于numpy.array,除了它有较少的参数。 这个例程对于将 Python 序列转换为ndarray非常有用。
 
numpy.asarray(a, dtype = None, order = None)
 构造器接受下列参数:
| 序号 | 参数及描述 | 
| 1. | a 任意形式的输入参数,比如列表、列表的元组、元组、元组的元组、元组的列表 | 
| 2. | dtype 通常,输入数据的类型会应用到返回的ndarray | 
| 3. | order 'C'为按行的 C 风格数组,'F'为按列的 Fortran 风格数组 | 
下面的例子展示了如何使用asarray函数:
示例 1
 
# 将列表转换为 ndarray 
import numpy as np 
 
x =  [1,2,3] 
a = np.asarray(x)  
print a输出如下:
[1  2  3] 
 示例2
 
# 设置了 dtype  
import numpy as np 
 
x =  [1,2,3] 
a = np.asarray(x, dtype =  float)  
print a输出如下:
[ 1.  2.  3.] 
 示例3
 
# 来自元组的 ndarray  
import numpy as np 
 
x =  (1,2,3) 
a = np.asarray(x)  
print a输出如下:
[1  2  3]
 示例4
 
# 来自元组列表的 ndarray
import numpy as np 
 
x =  [(1,2,3),(4,5)] 
a = np.asarray(x)  
print a输出如下:
[(1, 2, 3) (4, 5)]
 numpy.frombuffer
此函数将缓冲区解释为一维数组。 暴露缓冲区接口的任何对象都用作参数来返回ndarray。
numpy.frombuffer(buffer, dtype = float, count = -1, offset = 0)
 构造器接受下列参数:
| 序号 | 参数及描述 | 
| 1. | buffer 任何暴露缓冲区借口的对象 | 
| 2. | dtype 返回数组的数据类型,默认为float | 
| 3. | count 需要读取的数据数量,默认为-1,读取所有数据 | 
| 4. | offset 需要读取的起始位置,默认为0 | 
示例
下面的例子展示了frombuffer函数的用法。
 
import numpy as np 
s =  'Hello World' 
a = np.frombuffer(s, dtype =  'S1')  
print a输出如下:
['H'  'e'  'l'  'l'  'o'  ' '  'W'  'o'  'r'  'l'  'd']
 numpy.fromiter
此函数从任何可迭代对象构建一个ndarray对象,返回一个新的一维数组。
numpy.fromiter(iterable, dtype, count = -1)
构造器接受下列参数:
| 序号 | 参数及描述 | 
| 1. | iterable 任何可迭代对象 | 
| 2. | dtype 返回数组的数据类型 | 
| 3. | count 需要读取的数据数量,默认为-1,读取所有数据 | 
以下示例展示了如何使用内置的range()函数返回列表对象。 此列表的迭代器用于形成ndarray对象。
示例 1
 
# 使用 range 函数创建列表对象  
import numpy as np 
list = range(5)  
print list输出如下:
[0,  1,  2,  3,  4]
 示例2
 
# 从列表中获得迭代器  
import numpy as np 
list = range(5) 
it = iter(list)  
# 使用迭代器创建 ndarray 
x = np.fromiter(it, dtype =  float)  
print x输出如下:
[0.   1.   2.   3.   4.]
 相关推荐
- 阿里云国际站ECS:阿里云ECS如何提高网站的访问速度?
- 
        TG:@yunlaoda360引言:速度即体验,速度即业务在当今数字化的世界中,网站的访问速度已成为决定用户体验、用户留存乃至业务转化率的关键因素。页面加载每延迟一秒,都可能导致用户流失和收入损失。对... 
- 高流量大并发Linux TCP性能调优_linux 高并发网络编程
- 
        其实主要是手里面的跑openvpn服务器。因为并没有明文禁p2p(哎……想想那么多流量好像不跑点p2p也跑不完),所以造成有的时候如果有比较多人跑BT的话,会造成VPN速度急剧下降。本文所面对的情况为... 
- 性能测试100集(12)性能指标资源使用率
- 
        在性能测试中,资源使用率是评估系统硬件效率的关键指标,主要包括以下四类:#性能测试##性能压测策略##软件测试#1.CPU使用率定义:CPU处理任务的时间占比,计算公式为1-空闲时间/总... 
- Linux 服务器常见的性能调优_linux高性能服务端编程
- 
        一、Linux服务器性能调优第一步——先搞懂“看什么”很多人刚接触Linux性能调优时,总想着直接改配置,其实第一步该是“看清楚问题”。就像医生看病要先听诊,调优前得先知道服务器“哪里... 
- Nginx性能优化实战:手把手教你提升10倍性能!
- 
        关注△mikechen△,十余年BAT架构经验倾囊相授!Nginx是大型架构而核心,下面我重点详解Nginx性能@mikechen文章来源:mikechen.cc1.worker_processe... 
- 高并发场景下,Spring Cloud Gateway如何抗住百万QPS?
- 
        关注△mikechen△,十余年BAT架构经验倾囊相授!大家好,我是mikechen。高并发场景下网关作为流量的入口非常重要,下面我重点详解SpringCloudGateway如何抗住百万性能@m... 
- Kubernetes 高并发处理实战(可落地案例 + 源码)
- 
        目标场景:对外提供HTTPAPI的微服务在短时间内收到大量请求(例如每秒数千至数万RPS),要求系统可弹性扩容、限流降级、缓存减压、稳定运行并能自动恢复。总体思路(多层防护):边缘层:云LB... 
- 高并发场景下,Nginx如何扛住千万级请求?
- 
        Nginx是大型架构的必备中间件,下面我重点详解Nginx如何实现高并发@mikechen文章来源:mikechen.cc事件驱动模型Nginx采用事件驱动模型,这是Nginx高并发性能的基石。传统... 
- Spring Boot+Vue全栈开发实战,中文版高清PDF资源
- 
        SpringBoot+Vue全栈开发实战,中文高清PDF资源,需要的可以私我:)SpringBoot致力于简化开发配置并为企业级开发提供一系列非业务性功能,而Vue则采用数据驱动视图的方式将程序... 
- Docker-基础操作_docker基础实战教程二
- 
        一、镜像1、从仓库获取镜像搜索镜像:dockersearchimage_name搜索结果过滤:是否官方:dockersearch--filter="is-offical=true... 
- 你有空吗?跟我一起搭个服务器好不好?
- 
        来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。昨天闲的没事的时候,随手翻了翻写过的文章,发现一个很严重的问题。就是大多数时间我都在滔滔不绝的讲理论,却很少有涉及动手... 
- 部署你自己的 SaaS_saas如何部署
- 
        部署你自己的VPNOpenVPN——功能齐全的开源VPN解决方案。(DigitalOcean教程)dockovpn.io—无状态OpenVPNdockerized服务器,不需要持久存储。... 
- Docker Compose_dockercompose安装
- 
        DockerCompose概述DockerCompose是一个用来定义和管理多容器应用的工具,通过一个docker-compose.yml文件,用YAML格式描述服务、网络、卷等内容,... 
- 京东T7架构师推出的电子版SpringBoot,从构建小系统到架构大系统
- 
        前言:Java的各种开发框架发展了很多年,影响了一代又一代的程序员,现在无论是程序员,还是架构师,使用这些开发框架都面临着两方面的挑战。一方面是要快速开发出系统,这就要求使用的开发框架尽量简单,无论... 
- Kubernetes (k8s) 入门学习指南_k8s kubeproxy
- 
        Kubernetes(k8s)入门学习指南一、什么是Kubernetes?为什么需要它?Kubernetes(k8s)是一个开源的容器编排系统,用于自动化部署、扩展和管理容器化应用程序。它... 
欢迎 你 发表评论:
- 一周热门
- 
                    - 
                            
                                                                抖音上好看的小姐姐,Python给你都下载了
- 
                            
                                                                全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
- 
                            
                                                                Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
- 
                            
                                                                python入门到脱坑 输入与输出—str()函数
- 
                            
                                                                宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
- 
                            
                                                                Python三目运算基础与进阶_python三目运算符判断三个变量
- 
                            
                                                                (新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
- 
                            
                                                                慕ke 前端工程师2024「完整」
- 
                            
                                                                失业程序员复习python笔记——条件与循环
- 
                            
                                                                8÷2(2+2) 等于1还是16?国外网友为这道小学数学题吵疯了……
 
- 
                            
                                                                
- 最近发表
- 标签列表
- 
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
 
