Numpy计算科学模块(一)

目录

2.1什么是Numpy  

 2.2从Python到Numpy

2.2.2理解Python列表内存管理机制 

 2.2.3从Python列表到Numpy数组

2.2.4Numpy标准数据类型

2.3Numpy数组基础操作

 2.3.1随机数生成机制

2.3.2Numpy数组的常见属性

2.3.3索引访问数组元素


2.1什么是Numpy  

NumPy是使用Python进行科学计算的基础软件包。 

NumPy 核心技术之一: Ndarray
NumPy 最重要的一个特点是其 N 维数组对象 ndarray ,它是一系列同类型数据的集合,以 0 下标为开始
进行集合中元素的索引。
ndarray 对象是用于存放同类型元素的多维数组。
ndarray 中的每个元素在内存中都有相同存储大小的区域。

 NumPy核心技术之一:切片和索引

ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python list 的切片操作一样。
ndarray 数组可以基于 0~n 的下标进行索引,切片对象可以通过内置的 slice 函数,并设置 start,
stop step 参数进行,从原数组中切割出一个新数组。

 2.2PythonNumpy

 2.2.1Python数据类型的缺陷

1. C 语言中,每个变量的数据类型被明确地声明;而在 Python 中,类型是动态推断的。  

习题
1. 简述python 整形的内存存储机制,以及这种机制的优缺点。
当我们在 Python 中定义一个整型,例如 x = 10000 时, x 并不是一个 原生 整型,而是一个指
针,指向一个 C 语言的复合结构体,结构体里包含了一些值。 Python 变量中存的是指向具体数据
的地址。
这意味着与 C 语言这样的编译语言中的整型相比,在 Python 中存储一个整型会有一些开销。

2.2.2理解Python列表内存管理机制 

习题
1. 简述Python内存管理机制的不足。
Python 列表包含一个指向指针块的指针,这其中的每一个指针对应一个完整的 Python 对象。
2. 简述PythonNumpy数组的优缺点。
Python 列表:可变类型,冗余,低效,即可以存放各种类型数据,可充分利用碎片空间,分配数
据。但由于需要额外的头部,将会造成额外的内存消耗;如果,列表元素同类型,将会造成信息冗
余。
NumPy式数组:固定类型,高效,但是不灵活。

 2.2.3Python列表到Numpy数组

 1、np.random.random(size):返回规模为size的服从均匀分布的随机浮点数数组,位于半开区间

[0.0,1.0)
2 np.random.rand(d0, d1, ..., dn) 返回规模为 d0×d1×…×dn 的服从均匀分布的随机浮点数数组 ,
于半开区间 [0.0, 1.0)
3 np.random.randint(low,high,size): 返回规模为 size 的服从均匀分布的随机整形数组,位于半开
区间 [low,high), 不包括 high 这个整数。
4 np.random.normal(mean, std, size): 返回规模为 size 的服从高斯分布的随机整形数组, mean
均值, std 为方差。

 1np.zeros(size):返回规模为size的全0数组

 2np.ones(size):返回规模为size的全1数组

 3np.empty(size):返回规模为size的未初始化的数组(即数组的值保持着原内存中的数值)

 4np.eye(n):返回规模为n*n的单位矩阵

 5np.full(size,fill_value):返回规模为size的用fill_value填充的数组

 6、np.arange([start, ]stop, [step, ]):返回从startstop,步长为step的一维向量。与

python range() 函数类似。 start 默认为 0 step 默认为 1 。参数中包含 [] 代表可选参数。

 7、np.linspace(start, stop, num=50):返回一个从startstop区间均匀分为num份的一维向量。

num 默认值为 50

 习题

1. 创建一个3×3的、在0~1均匀分布的随机数组成的数组。

import numpy as np
A = np.random.random((3,3))
print(A)

 2. 创建一个3×3的、均值为0、方差为3的正态分布的随机数数组。

import numpy as np
A = np.random.normal(0,3,(3,3))
print(A)
3. 创建一个3×3的、[0, 10)区间的随机整型数组。
import numpy as np
A = np.random.randint(0,10,(3,3))
print(A)
4. 创建规模为(4,)类型为浮点数的全0矩阵。
import numpy as np
A = np.zeros((4,))
print(A)
5. 创建规模为(3,),类型为整形的全1矩阵。
import numpy as np
A = np.ones((3,),dtype=int)
print(A)
6. 创建规模为(3,2),类型为浮点的未初始化矩阵。
import numpy as np
A = np.empty((3,2))
print(A)
7. 创建规模为(3,2,2),用3填充的矩阵。
import numpy as np
A = np.full((3,2,2),3)
print(A)
8. 创建规模为(3,3)的单位矩阵。
import numpy as np
A = np.eye(3)
print(A)
9. 自定义参数,使用arangelinspace创建一维数组。比较它们之间的异同点。
import numpy as np
A = np.arange(0,10,2)
print(A)
B = np.linspace(0,10,5)
print(B)

[0 2 4 6 8]
[ 0. 2.5 5. 7.5 10. ]

2.2.4Numpy标准数据类型

NumPy 数组包含同一类型的值,因此详细了解这些数据类型及其限制是非常重要的。因为 NumPy 是在 C 语言的基础上开发的,所以 C Fortran 和其他类似语言的用户会比较熟悉这些数
据类型。
表中列出了标准 NumPy 数据类型。请注意,当构建一个数组时,你可以对参数 dtype 用一个字符
串参数来指定数据类型:
np.zeros(10, dtype='int16')

 或者使用NumPy 对象 np. 对参数 dtype 指定特定类型:

np.zeros(10, dtype=np.int16)
掌握数组的类型转换 astype() 方法
要转换数组的类型,请使用 .astype() 方法(首选)或类型本身作为函数。注意:类型转换函数返
回值为新的类型转换后的数组,对原数组变量的类型不影响。如果要更新原数组的类型,需要将返
回值赋值给原数组变量。

 习题

1. 分别使用字符串形式和numpy对象形式对数组进行自定义类型。自定义规模size,建立全0、全
    (1)随机数数组
      
import numpy as np
np_array_1 = np.zeros((5,))
np_array_2 = np.full((5,),1)
print(np_array_1)
print(np_array_2)
2. 使用arangelinspace数组自定义类型创建一维数组
import numpy as np
A = np.arange(0,10,2)
print(A)
B = np.linspace(0,10,5)
print(B)

[0 2 4 6 8]
[ 0. 2.5 5. 7.5 10. ]
3. 使用 .dtype 属性和 type() 函数查看上面建立的numpy数组对象的具体数据类型。
import numpy as np
np_array_1 = np.zeros((5,))
np_array_2 = np.full((5,),1)
print(np_array_1)
print(np_array_2)
print(np_array_1, np_array_1.dtype, type(np_array_1[0]))

[0. 0. 0. 0. 0.] float64 <class 'numpy.float64'>

2.3Numpy数组基础操作

1. 数组的属性 : 确定数组的大小、形状、存储大小、数据类型。
2. 数组的索引 : 获取和设置数组各个元素的值。
3. 数组的切片 : 在大的数组中获取或设置更小的子数组。
4. 数组的变形 : 改变给定数组的形状。
5. 数组的拼接和分裂 : 将多个数组合并为一个,以及将一个数组分裂成多个

 2.3.1随机数生成机制

理解随机数生成机制 ( 伪随机机制 )
通过设置 NumPy 的随机数生成器的 种子值 参数,以确保每次程序执行时都可以生成同样的随机
数组。
np.random.seed() 函数: 配置 random 模块的随机种子。然后,随机序列通过 randint() 、random()、 normal() 函数生成。
当传入 seed() 相同参数时,则每次生成的随机序列会相同。如果不设置 seed ,默认为将当前
时刻做为 seed ,那么此时的随机序列将会与之前的序列永远不一样,因为当前时刻是唯一
的。

习题

观察结果并回答,如果设置 seed() 参数为一样,那么随机结果是否发生变化。任意修改 seed()

参数,再观察运行结果是否变化。
import numpy as np
np.random.seed(5)
a = np.linspace(1,10,5)
b = np.linspace(1,10,5)
print(a)
print(b)

2.3.2Numpy数组的常见属性

 首先定义三个随机的数组:一个一维数组、一个二维数组和一个三维数组。

import numpy as np
np.random.seed(0) # 设置随机数种子
x1 = np.random.randint(10, size=6) # 一维数组
x2 = np.random.randint(10, size=(3, 4)) # 二维数组
x3 = np.random.randint(10, size=(3, 4, 5)) # 三维数组
每个数组有 ndim (数组的维度)、 shape (数组每个维度的大小)和 size (数组元素数量)属性。
数组元素的数据类型: dtype 属性。
数组元素字节大小: itemsize 属性。数组总字节大小: nbytes 属性。一般来说,可以认为 nbytes
itemsize size 的乘积大小相等。
习题
1. 随机生成一个三维数组 size (n,m,k) 的数组,然后使用属性输出数据的维度、每个维度的大
小、数组元素数量、数据类型。
import numpy as np
np.random.seed(0)
X = np.random.randint(10,size=(3,4,5))
print("X ndim: ", X.ndim)
print("X shape:", X.shape)
print("X size: ", X.size)
print("X dtype:", X.dtype)

2.3.3索引访问数组元素

通过中括号指定索引获取第 个值(从 0 开始计数)。
使用负索引访问数组的末尾进行。
import numpy as np
np.random.seed(0) # 设置随机数种子
x1 = np.random.randint(10, size=6) # 一维数组
print(x1)
print(x1[0])
print(x1[4])
Numpy 相对于 Python 列表,直接支持多维数组 ( 一个重大的技术突破 ) Numpy 数据可以通过索引,直
接访问多维数组的元素。多维数组中,可以用逗号分隔的索引元组获取元素。 Python 列表并没有实现多
维列表功能,虽然它可以使用嵌套表示多维列表,但是元素索引访问比较繁琐。
类似于 Python ,可以修改索引访问的元素的值。
x2 = np.random.randint(10, size=(3, 4)) # 二维数组
print(x2)
print(x2[0, 0])
print(x2[2, 0])
print(x2[2, -1])
习题
1. 随机生成一个三维数组 size (n,m,k) 的整数数组,使用正索引访问元素,负索引访问元素,正 负索引组合访问元素。
x = np.random.randint(10, size=(3,3,3)) # 二维数组
print(x)
print(x[0,0,0])
print(x[2,0,0])
print(x[2,0,-1])

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值