数据分析---科学计算工具numpy(上)

科学计算工具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()

数据分析—科学计算工具numpy(下)

这里是引用

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ElegantCodingWH

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

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

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

打赏作者

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

抵扣说明:

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

余额充值