Numpy库(一):创建ndarray
一、Numpy库简介
Numpy(number python),一个重要的python语言数学运算库,在数据分析,机器学习,科学运算,图像处理等方面有重要的作用。他是大量Python数学与科学计算包的基础,内建了大量的函数,方便快速构建数学模型。
二、ndarray对象
Numpy库的核心是ndarray(N-dimensional array,N维数组)对象。它是一种指定了类型和大小的多维数组。
(1)创建数组
在Numpy库中,采用函数array() 进行创建数组,传入的参数为元组或列表。在创建数组时,可以通过指定dtype属性的值来设置数组的数据类型。
import numpy as np
a = np.array([[1,2,3],[4,5,6]]) # 采用列表嵌套的形式传入参数
b = np.array(((1,2,3),(4,5,6))) # 采用元组嵌套的形式传入参数
c = np.array([[1,2,3],(4,5,6)]) # 采用元组、列表混合的列表嵌套形式传入参数
a = np.array([[1,2,3],[4,5,6]], dtype=int32) # 设置数组的dtype属性
(2)数组常用属性
ndarray对象有一些常用的属性,如dtype、ndim、size、shape等。可以采用函数type()检测一个对象是否为ndarray对象。
import numpy as np
a = np.array([[1,2,3],[4,5,6]])
print('数组的类型:', type(a))
print('数组的维数:', a.ndim)
print('数组的元素个数:', a.size)
print('数组的形状:', a.shape)
print('数组的数据类型:', a.dtype)
上述代码的输出内容如下:
数组的类型: <class 'numpy.ndarray'>
数组的维数: 2
数组的元素个数: 6
数组的形状: (2, 3)
数组的数据类型: int32
(3)数组的数据类型
Numpy库支持的数据类型如下表所示:
名称 | 描述 |
---|---|
bool_ | 以一个字节形式存储的布尔型数据类型(True 或者 False) |
int_ | 默认的整数类型(类似于 C 语言中的 long,int32 或 int64) |
intc | 与 C 的 int 类型一样,通常为int32 或 int 64 |
intp | 用于索引的整数类型(类似于 C 的 ssize_t,通常仍然是 int32 或 int64) |
int8 | 字节(-128 ~127) |
int16 | 整数(-32768 ~ 32767) |
int32 | 整数(-2147483648 ~ 2147483647) |
int64 | 整数(-9223372036854775808 ~ 9223372036854775807) |
uint8 | 无符号整数(0 ~ 255) |
uint16 | 无符号整数(0 ~ 65535) |
uint32 | 无符号整数(0 ~ 4294967295) |
uint64 | 无符号整数(0 ~ 18446744073709551615) |
float_ | float64 类型的简写 |
float16 | 半精度浮点数,包括:1 个符号位,5 个指数位,10 个尾数位 |
float32 | 单精度浮点数,包括:1 个符号位,8 个指数位,23 个尾数位 |
float64 | 双精度浮点数,包括:1 个符号位,11 个指数位,52 个尾数位 |
complex_ | complex128 类型的简写,即 128 位复数 |
complex64 | 复数,表示双 32 位浮点数(实数部分和虚数部分) |
complex128 | 复数,表示双 64 位浮点数(实数部分和虚数部分) |
(4)内置特殊数组创建形式
Numpy内置了几个生成包含初始值的N维数组,能够高效的生成所需数组。如零一数组、对角数组等。
1.零一数组、对角数组
零一数组的生成函数为zeros() 和ones() ,传入的参数必须是一个包含两个元素的元组,其中第一个元素为数组的维数,第二个为数组的列数。
对角矩阵的生成函数为eye() ,传入的参数为int型数字。对角矩阵的定义如下:主对角线上的元素为一,其余元素为零的矩阵。对角矩阵的维数和列数相同。
生成的数组默认数据类型为浮点数,可以通过定义数组的dtype属性将其更改。
import numpy as np
print('零数组:\n', np.zeros((2,3))) #生成一个初始值为0的,形状为2*3的零数组
print('一数组:\n', np.ones((2,3))) #生成一个初始值为1的,形状为2*3的一数组
print('对角组:\n', np.eye(3)) #生成一个形状为3*3的,对角数组
上述代码的输出如下:
零数组:
[[0. 0. 0.]
[0. 0. 0.]]
一数组:
[[1. 1. 1.]
[1. 1. 1.]]
对角组:
[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]
此外,对角矩阵可以在一个原有的一维数组上进行创建。新建的数组的维数和列数与原数组的列数相同。
import numpy as np
a = np.array([1, 2, 3])
print(np.diag(a))
输出的结果如下:
[[1 0 0]
[0 2 0]
[0 0 3]]
2.序列数组
Numpy库内置的函数arange() 能够依据提供的数值范围创建数组。传入参数类似于Python的内置函数range(),不同的地方在于,arrage()函数设置的步长可以为浮点型。
import numpy as np
print('生成0到10的序列函数:\n', np.arange(0,10))
print('生成0到10的,步长为2的序列函数:\n', np.arange(0,10,2))
print('生成0到10的,步长为2.5的序列函数:\n', np.arange(0,10,2.5))
输出如下所示:
生成0到10的序列函数:
[0 1 2 3 4 5 6 7 8 9]
生成0到10的,步长为2的序列函数:
[0 2 4 6 8]
生成0到10的,步长为2.5的序列函数:
[0. 2.5 5. 7.5]
此外,内置函数 linspace() 能够用于生成等差数组。传入的前两个参数依旧表示数据范围的开始与结束,而第三个参数则表示为范围内的数字等分为几部分。参数endpoint 的值取True或False,表示是否将结束的数字纳入数列中。
import numpy as np
print('将0到10的数字五等份,包含数字10:\n', np.linspace(0,10,5))
print('将0到10的数字五等份,不包含数字10:\n', np.linspace(0,10,5,endpoint=False))
输出结果如下:
将0到10的数字五等份,包含数字10:
[ 0. 2.5 5. 7.5 10. ]
将0到10的数字五等份,不包含数字10:
[0. 2. 4. 6. 8.]
3.随机数组
Numpy的随机数主要由numpy.random模块实现。模块内常用的函数包括:
- 函数rand(): 根据给定维度生成 [0, 1) 之间的数据,包含0,不包含1
- 函数randn(): 返回一组具有标准正态分布的数组
- 函数randint(): 在给定的数据范围内生成指定数目的整数;传入参数为数据范围的始末值和数组大小
- 函数random_sample: 在 [0, 1) 区间内生成指定个数的随机浮点数
import numpy as np
print('0、1分布:\n', np.random.rand(2,3))
print('标准正态分布:\n', np.random.randn(3,2))
print('随机整数:\n', np.random.randint(2,10,5))
print('随机浮点数:\n', np.random.random(5))
输出内容如下:
0、1分布:
[[0.87445382 0.09422451 0.06907788]
[0.27529741 0.36810821 0.22623295]]
标准正态分布:
[[-0.75812562 -0.26682828]
[ 1.57646845 -1.08735943]
[-0.30249788 -0.13160996]]
随机整数:
[4 7 9 4 2]
随机浮点数:
[0.11699514 0.98790709 0.85412832 0.75072901 0.06532423]
此外,在numpy.random模块还存在一个特殊的内置函数seed(),称为随机数种子。
设置了随机数种子后能够使得随机数据可以被预测。当设置相同的seed,每次生成的随机数相同;如果不设置seed,则每次会生成不同的随机数。
import numpy as np
np.random.seed(2333)
a = np.random.rand(5)
np.random.seed(2)
b = np.random.rand(5)
np.random.seed(2333)
c = np.random.rand(5)
print('seed:2333\na\n', a)
print('seed:2\nb\n', b)
print('seed:2333\nc\n', c)
输出结果如下:
seed:2333
a
[0.52977763 0.8944875 0.24233821 0.92696067 0.19186078]
seed:2
b
[0.4359949 0.02592623 0.54966248 0.43532239 0.4203678 ]
seed:2333
c
[0.52977763 0.8944875 0.24233821 0.92696067 0.19186078]