科学计算工具numpy(上)
一、什么是numpy?
Numpy是python开源的科学计算工具包,它含有以下功能:
- 强大的N维数组对象:ndarray
- 对数组结构进行运算(不用遍历循环)
- 随机数、线性代数、傅里叶变换等功能
二、numpy基础数据结构
1.numpy数组—ndarray的基本操作(属性)
numpy数组是一个多维数组对象,称为ndarray,其由两部分构成:
- 实际的数据
- 描述这些数据的元数据
eg:
import numpy as np
lst =[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
ar = np.array(lst)
print(lst)
print(ar, type(ar)) # ar是n维数组类型
print(ar.ndim) # ndim返回numpy的轴数
print(ar.shape) # shape返回numpy的纬度,轴数与列数,且是一个元组,(3,4)
print(ar.size) # 返回元素个数
print(ar.dtype) # ndarray中元素的类型
print(ar.itemsize) # ndarray中一个元素所占的字节数
print(ar.data) # ndarray对象ar的物理地址
# 结果:
[[1, 2, 3, 4], [2, 3, 4, 5], [3, 4, 5, 6]]
[[1 2 3 4]
[2 3 4 5]
[3 4 5 6]] <class 'numpy.ndarray'>
2
(3, 4)
12
int32
4
<memory at 0x000001FFFB43CA68>
2.创建numpy数组—ndarray
(1)列表,元组,数组,生成器等做np下的array()函数的参数创建数组
eg:
# 创建数组,array()函数的括号中可以是列表,元组,数组,生成器等
ar1 = np.array(range(10)) # range是一个生成器
ar2 = np.arange(10) # 等价于上一行代码, arange和range的用法一模一样,只是这是调用的np的方法
print(ar1)
print(ar2)
# 如果元素类型不同,会自动将类型转为大的
ar3 = np.array([[1, 2, 3, 4], ['a', 'b', 'c', 'd']])
print(ar3)
# 如果每个轴中的元素不等,则无论之前输入的是多少维,都会自动的变为一维数组
ar4 = np.array([[1, 2, 3, 4, 5], ['a', 'b', 'c', 'd']])
print(ar4, ar4.ndim)
# 结果:
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[['1' '2' '3' '4']
['a' 'b' 'c' 'd']]
[list([1, 2, 3, 4, 5]) list(['a', 'b', 'c', 'd'])] 1
(2)用np下的linspace()函数
print(np.linspace(10, 20, num=6)) # []左闭右闭,num是表示显示几个数,如果是n等分,则num = n + 1
print(np.linspace(10, 20, num=6, endpoint=False)) # endpoint是否包含最后一个点
print(np.linspace(10, 20, num=6, retstep=True)) # retstep为True会返回一个二元元组,第二个参数是步长
# 结果:
[10. 12. 14. 16. 18. 20.]
[10. 11.66666667 13.33333333 15. 16.66666667 18.33333333]
(array([10., 12., 14., 16., 18., 20.]), 2.0)
(3)用np下的zeros()、zeros_like()、ones()、ones_like() 函数
# zeros() zeros_like() 元素全是0 ones() ones_like() 元素全是1
print(np.zeros(10))
print(np.zeros((3, 5))) # 注意:这里参数是元组
print(np.zeros((3, 5), dtype=np.int))
ar1 = np.array([list(range(10)), list(range(10, 20))])
print(np.zeros_like(ar1))
ar2 = np.array(['a', 'b'])
print(np.zeros_like(ar2))
# ones和zeros的用法一模一样
ar2 = np.array(['a', 'b'])
print(np.ones_like(ar2))
# 结果:
[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]
[0 0 0 0 0 0 0 0 0 0]]
['' '']
['1' '1']
(4)用np下的eye()函数
# 用eye()方法,默认生成的是对角线为1的n×n矩阵
print(np.eye(5))
# 结果:
[[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.]]
(5)np下的reshape()函数
# 以后常用的生成ndarray的方法
print(np.random.rand(10).reshape(2, 5))
# 结果:
[[0.39366876 0.16007069 0.9278696 0.06349453 0.13076 ]
[0.9044376 0.70655228 0.34562442 0.34571877 0.60094136]]
# 当然,一个已经存在了的np,也可以用reshape来改变形状
ar = np.arange(10)
b = ar.reshape(2, 5)
print(b)
# 结果
[[0 1 2 3 4]
[5 6 7 8 9]]
三、numpy通用函数与方法
1.数组的形状:T 、reshape()、resize()
(1)T 、reshape()、resize()
eg:T
ar = np.array([list(range(5)), list(range(5,10))])
print(ar.T) # 注意:这里是ar.T 不是ar.T()
#结果:
[[0 5]
[1 6]
[2 7]
[3 8]
[4 9]]
eg:reshape()
ar = np.array([list(range(5)), list(range(5,10))])
print(np.reshape(ar, (5, 2))) # 用np下的reshape()函数
print(ar.reshape(5, 2)) # 用ndarray下的reshape()方法
#结果:
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
[[0 1 2 3 4]
[5 6 7 8 9]]
eg:resize()
print(np.resize(ar, (5, 2))) # 用np下的resize()函数
print(ar.resize(5, 2)) # 用array下的resize()方法,发现是不行的,只能用np下的方法
#结果:
[[0 1]
[2 3]
[4 5]
[6 7]
[8 9]]
None
(2)reshape()与resize() 的区别
注意:reshape()与resize()的不同之处在于,对于reshape()之前与之后的元素个数必须相同,而resize()不足的随机补充,过长就截断
eg:
import numpy as np
ar = np.arange(4)
b = np.resize(ar, (3, 4))
print(b)
# 结果:
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]
2.ndarray的复制
eg:
import numpy as np
ar = np.array([list(range(5)), list(range(5,10))])
ar2 = ar.copy() # 属于深复制
print(ar2)
#结果:
[[0 1 2 3 4]
[5 6 7 8 9]]
3.改变numpy的元素类型
(1)在生成np时,可以通过设置dtype属性来设置元素的类型
eg:
ar = np.array([1, 2, 3.0], dtype=int)
print(ar)
# 结果
[1 2 3]
(2)改变已经生成的numpy元素类型
注意:numpy中的数据类型转换,不能直接改原数据的dtype!只能用函数astype()。
eg:dtype与astype()
ar = np.arange(3)
print(ar, ar.shape)
b = ar.astype('float32')
print(b, b.shape)
ar.dtype = 'float32'
print(ar, ar.shape)
# 结果:
[0 1 2] (3,)
[0. 1. 2.] (3,)
[0.e+00 1.e-45 3.e-45] (3,)
结论:resize()只能用np.resize()
3.ndarray堆叠
注意:hstack()是横向堆叠, vstack是竖直堆叠
eg:
ar = np.array([[1], [2], [3]]) # 3*1
ar2 = np.array([['a'], ['b'], ['c']]) # 3*1
print(np.hstack((ar, ar2))) # 横向连接 3*2
print(np.vstack((ar, ar2))) # 竖向叠加 6*1
# 结果:
[['1' 'a']
['2' 'b']
['3' 'c']]
[['1']
['2']
['3']
['a']
['b']
['c']]
3.ndarray的拆分
注意:hsplit()是横向拆分, vsplit()是竖直拆分
eg:
ar = np.arange(16).reshape(4, 4)
print(ar)
print(np.hsplit(ar, 2)[0]) # 数值2代表的是要分成几列,0是代表取第1列数据
# 结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
[[ 0 1]
[ 4 5]
[ 8 9]
[12 13]]
3.ndarray的简单运算
eg:
ar = np.arange(8).reshape(2, 4)
print(ar + 10) # 加法
print(ar - 1) # 减法
print(ar * 10) # 乘法
print(ar / 2) # 除法
print(ar.mean()) # 求平均数
print(ar.max()) # 求最大值
print(ar.min()) # 求最小值
print(ar.std()) # 求标准差
print(ar.var()) # 求方差
print(np.sort(ar)) # 排序
print(ar.sum()) # 求和
print(np.sum(ar, axis=1)) # 求方和,axis=1是按照行求和,axis=0是按照列求和
小结
narray
的转置是ar.T
,不是ar.T()
- 用np的函数的有:
np.resize()
、np.astype()
、按行列求和np.sum(ar, axis=1)
、np.sort()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84779.html