NumPy 入门(上)

NumPy 的初阶知识【上】


1. 简介

NumPy(Numerical Python) 是 Python 语言的一个运行速度非常快的扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库 ,通常与 SciPy和 Matplotlib(绘图库)一起使用

  • SciPy(Scientific Python) 是一个开源的 Python 算法库和数学工具包。 SciPy 包含的模块有最优化、线性代数、积分、插值、特殊函数、快速傅里叶变换、信号处理和图像处理、常微分方程求解和其他科学与工程中常用的计算

  • Matplotlib 是 Python 编程语言及其数值数学扩展包 NumPy 的可视化操作界面。它为利用通用的图形用户界面工具包,如 Tkinter, wxPython, Qt 或 GTK+ 向应用程序嵌入式绘图提供了应用程序接口(API)

Python 的 List 和 NumPy中的数组对比:

  • Python的列表是异构的,因此列表的元素可以包含任何对象类型。

  • NumPy数组是同质的(即数组中的数据项的类型必须一致),只能存放同一种类型的对象,便于我们直接确定存储数组所需空间大小。数组由两部分构成:

    • 存储在连续的内存块中的实际数据
    • 描述实际数据的元数据
      NumPy 中的大部分数组方法和函数都不会直接修改实际数据,而只能修改元数据
  • Python的列表通常需要借助循环遍历元素并逐个处理,而NumPy使用了优化过的C API,所以运算速度很快


2. 数据类型及基础操作


2.1 NumPy的数据类型

 NumPy的数据类型

📢注意:

  • 不能把复数类型转化成整型或浮点型,否则会报错 TypeError, 但浮点数是可以转化成复数的

2.2 Ndarray 对象

  • numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)

N 维数组对象 ndarray,它是一系列同类型数据的集合,以 0 下标为开始进行集合中元素的索引

ndarray 中的每个元素在内存中都有相同存储大小的区域

参数描述

  • object 数组或嵌套的数列

  • dtype 数组元素的数据类型,可选。

    • 类 dtype 的属性str中保存的是一个表示数据类型的字符串,第一个字符串描述字节顺序,如果需要,后面会跟着字符码和数字,用来表示存储每个数组所需的字节数
      • 字节顺序规定了32位或64位字内部各个字节的存储顺序。对于大端顺序(big-endian),先存放权重最高的字节,用 > 指出;对于小端顺序(little-endian),先存放权重最低的字节,用 < 指出
  • copy 对象是否需要复制,可选

  • order 创建数组的样式,C为行方向,F为列方向,A为任意方向(默认)

  • subok 默认返回一个与基类类型一致的数组

  • ndmin 指定生成数组的最小维度

  • 补充:除了上述属性外,ndarray类型还有很多属性:

    • size 属性保存元素数量
    • itemsize 属性返回数组中各元素所占用的字节数
    • T 属性的作用与 transpose() 函数相同
    • flat 属性可返回一个 numpy.flatier 对象,这是获得 flatier 对象的唯一方法。我们可使用 flat 的迭代器来遍历数组,要注意的是:如果用 flat 属性迭代赋值,则该值会覆盖这个数组内的所有元素的值

下列为常见的数据类型及其字符码:(注:np.sctypeDict.keys() 可以列出所有数据类型的字节码)

类型字符码
整型i
无符号整型u
单精度浮点型f
双精度浮点型d
布尔型b
复数型D
字符串S
万国码(unicode)U
空类型(Void)V

2.2.1 举例
import numpy as np 

# 一维,输出:[1 2 3]
a = np.array([1,2,3])  
print (a)
 
# 二维,输出:[[1, 2], [3, 4]] 
a = np.array([[1,  2],  [3,  4]])  
print (a)

# 最小维度为二维   
a = np.array([1, 2, 3, 4, 5], ndmin =  2)  
print (a)

2.2.2 NumPy 数组转换成Python列表
  • tolist()函数
import numpy as np

b = np.array([ 1.+1.j, 3.+2.j])
b.tolist()
print(b, '\n')
print(type(b))

2.2.3 把数组元素转换成指定类型
  • astype() 函数
import numpy as np

b = np.array([ 1.+1.j, 3.+2.j])
b.astype(int)                           # 当 complex 类型转换成 int 类型时,虚部被丢弃,此时会有ComplexWarning
print(b, '\n')
print(type(b))

b.astype('complex')                     # 将数据类型的名字以字符串的形式传递给 astype() 函数
print(b, '\n')
print(type(b))

2.3 创建数组

ndarray 数组除了可以使用底层 ndarray 构造器来创建外,也可以通过以下几种方式来创建:

  • numpy.empty(shape, dtype = float, order = 'C')

  • numpy.zeros(shape, dtype = float, order = 'C')

  • numpy.ones(shape, dtype = None, order = 'C')

  • numpy.asarray(a, dtype = None, order = None)

  • numpy.arange(start, stop, step, dtype)

  • np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

  • np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)


2.3.1 指定形状(shape)、数据类型(dtype)且未初始化
  • numpy.empty(shape, dtype = float, order = 'C')
# 数组元素为随机值,因为它们未初始化。

import numpy as np 
x = np.empty([3,2], dtype = int) 
print (x)


2.3.2 指定大小的数组,数组元素以 0 来填充
  • numpy.zeros(shape, dtype = float, order = 'C')
# 设置类型为整数

y = np.zeros((5), dtype = int) 
print(y)


2.3.3 指定形状的数组,数组元素以 1 来填充
  • numpy.ones(shape, dtype = None, order = 'C')
# 默认为浮点数,输出为:[1. 1. 1. 1. 1.]

x = np.ones(5) 
print(x)


2.3.4 直接传入元素
  • numpy.asarray(a, dtype = None, order = None)

    • 参数a可以是任意形式的输入参数:列表, 列表的元组, 元组, 元组的元组, 元组的列表,多维数组

x =  [1,2,3] 
a = np.asarray(x)  
print (a)


2.3.5 传入数值范围并返回 ndarray 对象
  • numpy.arange(start, stop, step, dtype)
# dtype	返回ndarray的数据类型,如果没有提供,则会使用输入数据的类型。

# 生成 0 到 5 的数组: 
x = np.arange(5)  
print (x)

# 设置了起始值、终止值及步长:
x = np.arange(10, 20, 2)  
print (x)


2.3.6 由等差数列构成的一维数组
  • np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

    • num 要生成的等步长的样本数量,默认为50
    • endpoint 该值为 true 时,数列中包含stop值,反之不包含,默认是True
    • retstep 如果为 True 时,生成的数组中会显示间距,反之不显示
# 返回浮点数,输出:[10. 12. 14. 16. 18.]

a = np.linspace(10, 20,  5, endpoint =  False)  
print(a)


2.3.7 由等比数列构成的一维数组
  • np.logspace(start, stop, num=50, endpoint=True, base=10.0, dtype=None)
# 默认底数是 10

a = np.logspace(1.0,  2.0, num =  10)  
print (a)


2.4 NumPy 数组的属性

NumPy 数组的维数称为秩(rank),秩就是轴(axis)的数量,即数组的维度(dimensions)。 一维数组的秩为1,二维数组的秩为2,以此类推
NumPy 数组的属性

import numpy as np 
 
a = np.arange(24)  
print (a.ndim)             # a 现只有一个维度
# 现在调整其大小
b = a.reshape(2,4,3)       # b 现在拥有三个维度
print (b.ndim)
print (b.shape)            # 输出:(2, 4, 3)

print (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]]] """


2.5 索引与切片

  • 标量索引:ndarray 数组可以基于0-n的下标进行索引,切片对象可以通过内置的 slice 函数

  • 整数数组索引

  • 布尔数组索引

  • 花式索引


2.5.1 标量索引
import numpy as np
 
# 一维数组 
a = np.arange(10)
s = slice(2, 7, 2)      # slice(start, stop, step)
b = a[2:7:2]
# 使用 slice 函数和直接对数组进行索引切片所的结果一致
print(b == a[s])        # 输出为:[ True  True  True]

# 多维数组
a = np.array([[1,2,3], [3,4,5], [4,5,6]])
print(a)
print('从数组索引 a[1:] 处开始切割')
print(a[1:])

""" 输出:
[[3 4 5]
 [4 5 6]] """


2.5.2 整数数组索引
import numpy as np 
 
x = np.array([[1,  2], [3,  4], [5,  6]]) 
y = x[[0,1,2], [0,1,0]]         # 获取(0, 0)、(1, 1)、(2, 0)位置的元素
print(y)                        # 输出为:[1 4 5]


2.5.3 布尔数组索引
import numpy as np 
 
x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
print ('原数组是:')
print (x)
print ('\n')
# 现在我们会打印出大于 5 的元素  
print  ('大于 5 的元素是:')
print (x[x > 5])                # 输出为:[ 6  7  8  9 10 11]

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Larissa857

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值