numpy模块

Posted dadazunzhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了numpy模块相关的知识,希望对你有一定的参考价值。

一、numpy简介

numpy官方文档:https://docs.scipy.org/doc/numpy/reference/?v=20190307135750

numpy是Python的一种开源的数值计算扩展库。这种库可用来存储和处理大型numpy数组,比Python自身的嵌套列表结构要高效的多(该结构也可以用来表示numpy数组)。

numpy库有两个作用:

区别于list列表,提供了数组操作、数组运算、以及统计分布和简单的数学模型
计算速度快,甚至要由于python内置的简单运算,使得其成为pandas、sklearn等模块的依赖包。高级的框架如TensorFlow、PyTorch等,其数组操作也和numpy非常相似。

二、为什么用numpy

list1 = [1, 2, 3, 4]  # 向量
list2 = [5, 6, 6, 7]  # 向量

list = []  # 当索引为空时,通过索引添加值将会出错,只能通过append方法进行添加
for i in range(len(list1) - 1):
    # list[i] = list1[i] * list2[i] # 报错
    list.append(list1[i] * list2[i])

print(list)

[1, 2, 3]

[4, 5, 6]
如果我们想让list1 * list2得到一个结果为lis_res = [4, 10, 18],非常复杂。

三、创建numpy数组

numpy数组即numpy的ndarray对象,创建numpy数组就是把一个列表传入np.array()方法。

import numpy as np
创建一维的ndarray对象

arr = np.array([1, 2, 3])
print(arr, type(arr))

[1 2 3] <class ‘numpy.ndarray‘>

创建二维的ndarray对象
print(np.array([[1, 2, 3], [4, 5, 6]]))

[[1 2 3]
[4 5 6]]

创建三维的ndarray对象

print(np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]))

[[1 2 3]
[4 5 6]
[7 8 9]]

四、numpy数组的常用属性

属性 解释
T 数组的转置(对高维数组而言)
dtype 数组元素的数据类型
size 数组元素的个数
ndim 数组的维数
shape 数组的维度大小(以元组形式)
astype 类型转换

dtype种类:bool_, int(8,16,32,64), float(16,32,64)

# arr2 = np.array([[1, 2, 3], [4, 5, 6]])
# print(arr2)  # 二维数组的numpy数组(一般就是二维)

# 行与列交换
print(arr2.T)

# 在python中的数据类型 int32
print(arr2.dtype)

# 查看元组的个数
print(arr2.size)

# 查看数组的维度
print(arr2.ndim)

# 查看数组维度的大小(一元组的形式)
print(arr2.shape)  # (2, 3)两行三列

# 获取num数组的行
print(arr2.shape[0])

# 获取数组中的列
print(arr2.shape[1])

# 类型转换
print(arr2.astype(np.float64).dtype)

[[1 5]
[2 6]
[3 7]
[4 8]]
int32
8
2
(2, 4)
2
4
float64

五、获取numpy数组的行列数

由于numpy数组是多维的,对于二维的数组而言,numpy数组就是既有行又有列。注意:对于numpy我们一般多讨论二维的数组。

arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)

[[1 2 3]
[4 5 6]]

获取numpy数组的行和列构成的数组

print(arr.shape)

(2, 3)

#获取numpy数组的行
print(arr.shape[0])

2

获取numpy数组的列

print(arr.shape[1])

3

六、切割numpy数组

切分numpy数组类似于列表的切割,但是与列表的切割不同的是,numpy数组的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。

# 切片
# lis = [1, 2, 3]
# print(lis[:])  # 全部

arr2 = np.array([[1, 2, 3],
                 [4, 5, 6]])
print(arr2)  # 二维numpy(一般都是二维)
# numpy数组的切割涉及到行和列的切割,但是两者切割的方式都是从索引0开始,并且取头不取尾。

# 获取全部
print(arr2[:, :]) # 第一个冒号代表对行操作,第二冒号表示对列操作

# 取出第一行所有元素
print(arr2[:1, :])

# 取出第一行的所有元素
print(arr2[0, [0, 1, 2]])

# 取出第一列的所有元素
print(arr2[:, :1])
print(arr2[:,1:2])

# 取出第一列的元素,并转换成行
print(arr2[(0, 1), 0])

# # 取出第一行第一列的元素(取出冒号可以取出固定的一个值)
print(arr2[0, 1])

# numpy数组按运算取元素的原理及通过arr>5生成一个numpy数组
print(arr2 > 5)

print(arr2[arr2 > 2])


# # 数组元素的替换#
print(arr2)

# 取第一行的所有元素,并且让第一行的元素都为0
arr2[:1, :] = 0
print(arr2)

# 取出第一行第一列的元素为2
arr2[0, 0] = 2
print(arr2)

# 对数组清零
arr2[:, :] = 0
print(arr2)

# 取布尔值进行对齐修改值
arr2[arr2 < 4] = 3
print(arr2)

[[1 2 3]
[4 5 6]]
[[1 2 3]
[4 5 6]]
[[1 2 3]]
[1 2 3]
[[1]
[4]]
[[2]
[5]]
[1 4]
2
[[False False False]
[False False True]]
[3 4 5 6]

[[1 2 3 4]
[5 6 7 8]]
[[0 0 0 0]
[5 6 7 8]]
[[2 0 0 0]
[5 6 7 8]]
[[0 0 0 0]
[0 0 0 0]]
[[3 3 3 3]
[3 3 3 3]]

七、numpy数组元素替换

numpy数组元素的替换,类似于列表元素的替换,并且numpy数组也是一个可变类型的数据,即如果对numpy数组进行替换操作,会修改原numpy数组的元素,所以下面我们用.copy()方法举例numpy数组元素的替换。

arr = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
print(arr)

[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]

# 取第一行的所有元素,并且让第一行的元素都为0

arr1 = arr.copy()
arr1[:1, :] = 0
print(arr1)

[[ 0 0 0 0]
[ 5 6 7 8]
[ 9 10 11 12]]

取所有大于5的元素,并且让大于5的元素为0

arr2 = arr.copy()
arr2[arr > 5] = 0

print(arr2)
[[1 2 3 4]
[5 0 0 0]
[0 0 0 0]]

# 对numpy数组清零
arr3 = arr.copy()
arr3[:, :] = 0
print(arr3)

[[0 0 0 0]
[0 0 0 0]
[0 0 0 0]]

八、numpy数组的合并

# 数组合并
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
print(arr1)

print("*" * 50)
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(arr2)

# 合并两个numpy数组的行,注意使用hstack()方法合并numpy数组,
# numpy数组应该有相同的行,其中hstack的h表示horizontal水平的

# 行合并
print(np.hstack((arr1, arr2)))


# 合并两个numpy数组的列,注意使用vstack()方法合并numpy数组,
# numpy数组应该有相同的列,其中vstack的v表示vertical垂直的
# 列合并
print(np.vstack((arr1, arr2)))

# 默认合并列
print(np.concatenate((arr1, arr2)))

# 合并列
print(np.concatenate((arr1, arr2), axis=1))  # 1 表示行,0表示列

[[ 7 8]
[ 9 10]
[11 12]]
[[ 1 2 7 8]
[ 3 4 9 10]
[ 5 6 11 12]]
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
[[ 1 2]
[ 3 4]
[ 5 6]
[ 7 8]
[ 9 10]
[11 12]]
[[ 1 2 7 8]
[ 3 4 9 10]
[ 5 6 11 12]]
[11 12]]

九、通过函数创建numpy数组

方法 详解
array() 将列表转换为数组,可选择显式指定dtype
arange() range的numpy版,支持浮点数
linspace() 类似arange(),第三个参数为数组长度
zeros() 根据指定形状和dtype创建全0数组
ones() 根据指定形状和dtype创建全1数组
eye() 创建单位矩阵
empty() 创建一个元素全随机的数组
reshape() 重塑形状
arr1 = np.array([[1, 2, 3], [4, 5, 6]])  # 可变数据类型
print(arr1)

# print(arr1[0][2])

# 创建5行5列的数组,用零填充
print(np.zeros((5, 5)))

# 创建 五行五列使用1填充
print(np.ones((5,5)))
print(np.ones((5,5))*100)

# 对角矩阵
print(np.eye(5))

# 只能生成一维数组
print(np.arange(1,10, 2))

# p平均生成10份,构造x坐标轴的值
print(np.linspace(0, 20, 5))

# 重塑形状

arr = np.zeros((5, 5))
print(arr)
print(arr.reshape(1, 25))

[[1 2 3]
[4 5 6]]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]
[1. 1. 1. 1. 1.]]
[[100. 100. 100. 100. 100.]
[100. 100. 100. 100. 100.]
[100. 100. 100. 100. 100.]
[100. 100. 100. 100. 100.]
[100. 100. 100. 100. 100.]]
[[1. 0. 0. 0. 0.]
[0. 1. 0. 0. 0.]
[0. 0. 1. 0. 0.]
[0. 0. 0. 1. 0.]
[0. 0. 0. 0. 1.]]
[1 3 5 7 9]
[ 0. 5. 10. 15. 20.]
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
[[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
0.]]

十、numpy数组运算

运算符 说明
+ 两个numpy数组对应元素相加
- 两个numpy数组对应元素相减
* 两个numpy数组对应元素相乘
/ 两个numpy数组对应元素相除,如果都是整数则取商
% 两个numpy数组对应元素相除后取余数
**n 单个numpy数组每个元素都取n次方,如**2:每个元素都取平方
arr1 = np.array([[1, 2], [3, 4], [5, 6]])
print(arr1)
arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(arr2)
print(arr1 + arr2)

[[ 8 10]
[12 14]
[16 18]]

print(arr1**2)

[[ 1 4]
[ 9 16]
[25 36]]

十一、numpy数组运算函数

numpy数组函数 详解
np.sin(arr) 对numpy数组arr中每个元素取正弦,sin(x)sin(x)
np.cos(arr) 对numpy数组arr中每个元素取余弦,cos(x)cos(x)
np.tan(arr) 对numpy数组arr中每个元素取正切,tan(x)tan(x)
np.arcsin(arr) 对numpy数组arr中每个元素取反正弦,arcsin(x)arcsin(x)
np.arccos(arr) 对numpy数组arr中每个元素取反余弦,arccos(x)arccos(x)
np.arctan(arr) 对numpy数组arr中每个元素取反正切,arctan(x)arctan(x)
np.exp(arr) 对numpy数组arr中每个元素取指数函数,exex
np.sqrt(arr) 对numpy数组arr中每个元素开根号x??√

一元函数:abs, sqrt, exp, log, ceil, floor, rint, trunc, modf, isnan, isinf, cos, sin, tan

二元函数:add, substract, multiply, divide, power, mod, maximum, mininum

十二、numpy数组矩阵化

numpy数组的点乘必须满足第一个numpy数组的列数等于第二个numpy数组的行数,即m?n?n?m=m?mm?n·n?m=m?m。

arr1 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr1.shape)

(2, 3)

arr2 = np.array([[7, 8], [9, 10], [11, 12]])
print(arr2.shape)

(3, 2)

assert arr1.shape[0] == arr2.shape[1]
# 2*3·3*2 = 2*2
print(arr2.shape)

(3, 2)

12.2 numpy数组的转置

numpy数组的转置,相当于numpy数组的行和列互换。

arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr)

[[1 2 3]
[4 5 6]]

print(arr.transpose())

[[1 4]
[2 5]
[3 6]]

print(arr.T)

[[1 4]
[2 5]
[3 6]]

12.3 numpy数组的逆

numpy数组行和列相同时,numpy数组才可逆。

arr = np.array([[1, 2, 3], [4, 5, 6], [9, 8, 9]])
print(arr)

[[1 2 3]
[4 5 6]
[9 8 9]]

print(np.linalg.inv(arr))

[[ 0.5 -1. 0.5 ]
[-3. 3. -1. ]
[ 2.16666667 -1.66666667 0.5 ]]

# 单位numpy数组的逆是单位numpy数组本身
arr = np.eye(3)
print(arr)

[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

print(np.linalg.inv(arr))

[[1. 0. 0.]
[0. 1. 0.]
[0. 0. 1.]]

十三、numpy数组数学和统计方法

方法 详解
sum 求和
cumsum 累加求和
mean 求平均数
std 求标准差
var 求方差
min 求最小值
max 求最大值
argmin 求最小值索引
argmax 求最大值索引
sort 排序

十四、numpy.random生成随机数

函数名称 函数功能 参数说明
rand(d0,d1,?,dnd0,d1,?,dn) 产生均匀分布的随机数 dndn为第n维数据的维度
randn(d0,d1,?,dnd0,d1,?,dn) 产生标准正态分布随机数 dndn为第n维数据的维度
randint(low[, high, size, dtype]) 产生随机整数 low:最小值;high:最大值;size:数据个数
random_sample([size]) 在[0,1)[0,1)内产生随机数 size为随机数的shape,可以为元祖或者列表
choice(a[, size]) 从arr中随机选择指定数据 arr为1维数组;size为数组形状
uniform(low,high [,size]) 给定形状产生随机数组 low为最小值;high为最大值,size为数组形状
shuffle(a) 与random.shuffle相同 a为指定数组
# numpy随机数
# 三行四列
print(np.random.rand(3, 4))

print(np.random.randint(1, 20, (3, 4)))

print(np.random.choice([1, 2, 3, 45], 3))

print(arr2)
np.random.shuffle(arr2)
print(arr2)

# 随机数种子,所有的随机数都是按照随机数种子生成的
import time

# 重点
# np.random.seed(int(time.time()))
np.random.seed(1)

arr1 = np.random.rand(3,4)
print(arr1)

[[0.49694519 0.41009236 0.61939424 0.59533436]
[0.54258297 0.31824486 0.74005334 0.48675089]
[0.02653267 0.34009038 0.01152403 0.50444461]]
[[13 15 6 18]
[ 9 18 16 1]
[ 8 17 19 6]]
[ 3 1 45]
[[1 2 3 4]
[5 6 7 8]]
[[1 2 3 4]
[5 6 7 8]]
[[4.17022005e-01 7.20324493e-01 1.14374817e-04 3.02332573e-01]
[1.46755891e-01 9.23385948e-02 1.86260211e-01 3.45560727e-01]
[3.96767474e-01 5.38816734e-01 4.19194514e-01 6.85219500e-01]]

以上是关于numpy模块的主要内容,如果未能解决你的问题,请参考以下文章

11-2 numpy/pandas/matplotlib模块

Numpy 模块的学习 numpy中random模块

numpy模块

python中怎样安装numpy模块

模块讲解---numpymo模块,matplotlib模块,pandas模块

numpy模块