Numpy 轻松学

1. Numpy 简介

NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。底层是C语言编写出来然后嵌入到python中的。

2. 矩阵

在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,一般情况下是(n,m) 表示 n行m列。

3. 创建格式

array = numpy.array(List)# 多维度列表即可

import numpy as np
array = np.array([[1,2,3],[4,5,6]])# 一般传入的是多维度的List,自动转化为矩阵
print(array) # 输出矩阵
print('dim:',array.ndim) # 数据矩阵是多少维的
print('size:',array.size) # 一共多少元素
print('shape:',array.shape)# 几行几列
print('rank:',np.linalg.matrix_rank(array)) #矩阵的秩
print(a.T)
print(np.transpose(a)) # 同上
print(np.clip(a,2,5)) # 小于2的全是2 大于5 的全是5

结果:

[[1 2 3]
 [4 5 6]]
dim: 2
size: 6
shape: (2, 3)
rank: 2
---
[[1 4]
 [2 5]
 [3 6]]
 ---
[[1 4]
 [2 5]
 [3 6]]
 ---
 [[2 2 3]
 [4 5 5]]

在这里插入图片描述

4. 常用构建法

a = np.zeros((3,4)) # 构造全零矩阵
print(a)
b = np.ones((3,4)) # 构造全一矩阵
print(b)
c = np.empty((3,4)) # 数组元素为随机值,因为它们未初始化。
print(c)
d = np.eye(3) # n*n 的 单位矩阵
print(d) 

结果:

[[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. 0. 0.]
 [0. 1. 0.]
 [0. 0. 1.]]

常用:

e = np.arange(1,10,2) # 跟python range类似  start,end,step
print(e)
f = np.arange(12)
g = f.reshape((3,4))
print(f)
print(g)

结果:

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

一维:

e = np.arange(1,10,2)
print(type(e))
print(e.shape)
print((e.T).shape)

结果:

<class 'numpy.ndarray'>
(5,)  # 结果就是个tuple 列表
(5,)

等分:

h = np.linspace(1,10,4) # 从start end 输出 n 份
print(h)

结果:

[ 1.  4.  7. 10.]

5. random构造矩阵

  1. numpy.random.rand()
numpy.random.rand(d0,d1,,dn)
  • rand函数根据给定维度生成[0,1)之间的数据,包含0,不包含1
  • dn表格每个维度
  • 返回值为指定维度的array
np.random.rand(4,2)
#输出:
array([[ 0.02173903, 0.44376568],
       [ 0.25309942, 0.85259262],
       [ 0.56465709, 0.95135013],
       [ 0.14145746, 0.55389458]])
  1. numpy.random.randn()
numpy.random.randn(d0,d1,,dn)
  • randn函数返回一个或一组样本,具有标准正态分布
  • dn表格每个维度
  • 返回值为指定维度的array
np.random.randn() # 当没有参数时,返回单个数据
# 输出:
-1.1241580894939212
np.random.randn(2,4)
# 输出
array([[ 0.27795239, -2.57882503, 0.3817649 , 1.42367345],
         [-1.16724625, -0.22408299, 0.63006614, -0.41714538]])
  1. numpy.random.randint()
numpy.random.randint(low, high=None, size=None, dtype=’l’)
  • 返回随机整数,范围区间为[low,high),包含low,不包含high
  • 参数:low为最小值,high为最大值,size为数组维度大小,dtype为数据类型,默认的数据类型是np.int
  • high没有填写时,默认生成随机数的范围是[0,low)
np.random.randint(1,size=5) # 返回 [0,1) 之间的整数,所以只有0
# 输出
array([0, 0, 0, 0, 0])
---
np.random.randint(1,5) # 返回 1 个 [1,5) 时间的随机整数
# 输出
4
---
np.random.randint(-5,5,size=(2,2))
# 输出
array([[ 2, -1],
       [ 2, 0]])
  1. 生成[0,1)之间的浮点数
print('-----------random_sample--------------')
print(np.random.random_sample(size=(2,2)))
print('-----------random--------------')
print(np.random.random(size=(2,2)))
print('-----------ranf--------------')
print(np.random.ranf(size=(2,2)))
print('-----------sample--------------')
print(np.random.sample(size=(2,2)))
----
-----------random_sample--------------
[[ 0.34966859  0.85655008]
 [ 0.16045328  0.87908218]]
-----------random--------------
[[ 0.25303772  0.45417512]
 [ 0.76053763  0.12454433]]
-----------ranf--------------
[[ 0.0379055   0.51288667]
 [ 0.71819639  0.97292903]]
-----------sample--------------
[[ 0.59942807  0.80211491]
 [ 0.36233939  0.12607092]]
  1. numpy.random.choice()
numpy.random.choice(a, size=None, replace=True, p=None)
  • 从给定的一维数组中生成随机数
  • 参数: a为一维数组类似数据或整数;size为数组维度;p为数组中的数据出现的概率
  • a为整数时,对应的一维数组为np.arange(a)
np.random.choice(5,3)
# 输出
array([4, 1, 4])
---
np.random.choice(5, 3, replace=False)
# 当replace为False时,生成的随机数不能有重复的数值
# 输出
array([0, 3, 1])
---
np.random.choice(5,size=(3,2))
# 输出
array([[1, 0],
       [4, 2],
       [3, 3]])
---
demo_list = ['lenovo', 'sansumg','moto','xiaomi', 'iphone']
np.random.choice(demo_list,size=(3,3))# 输出
array([['sansumg', 'sansumg', 'sansumg'],
      ['sansumg', 'sansumg', 'sansumg'],        
      ['sansumg', 'xiaomi', 'iphone']],        
      dtype='<U7')
  • 参数p的长度与参数a的长度需要一致
  • 参数p为概率,p里的数据之和应为1
demo_list = ['lenovo', 'sansumg','moto','xiaomi', 'iphone']
np.random.choice(demo_list,size=(3,3),
                p=[0.1,0.6,0.1,0.1,0.1])# 输出
array([['sansumg', 'sansumg', 'sansumg'],     
      ['sansumg', 'sansumg', 'sansumg'],     
      ['sansumg', 'xiaomi', 'iphone']],           
      dtype='<U7')
  1. numpy.random.seed()
  • np.random.seed()的作用:使得随机数据可预测。
  • 当我们设置相同的seed,每次生成的随机数相同。如果不设置seed,则每次会生成不同的随机数
np.random.seed(0)
np.random.rand(5)
# 输出
array([ 0.5488135 , 0.71518937, 0.60276338, 0.54488318, 0.4236548 ])
---
np.random.seed(1676)
np.random.rand(5)
# 输出
array([ 0.39983389, 0.29426895, 0.89541728, 0.71807369, 0.3531823 ])
---
np.random.seed(1676)
np.random.rand(5)
# 输出
array([ 0.39983389, 0.29426895, 0.89541728, 0.71807369, 0.3531823 ]

6. 矩阵运算

1. 减法 加法

对应位置逐个加减法。

a = np.array([2,3,4])
b = np.array([1,2,3])
c = a - b 
d = a + b 
print(a)
print(b)
print(c)
print(d)

结果

[2 3 4]
[1 2 3]
[1 1 1]
[3 5 7]
2. 乘法
a = np.array([2,3,4])
b = np.array([1,2,3])
c = a**2
print(a)
print(a > 3) # 哪些值 大于3
print(a == 3) #哪些值等于3
print(c)
d = 10* np.sin(a) 
print(d)

结果:

[2 3 4]
[False False  True]
[False  True False]
[ 4  9 16]
[ 9.09297427  1.41120008 -7.56802495]

点乘跟矩阵乘法

a = np.array([[1,1],[0,1]])
b = np.arange(4).reshape((2,2))
print(a)
print(b)
c = a* b  # 逐个相乘
print(c)
d1 = a.dot(b) # 矩阵乘法第一种
d2 = np.dot(a,b) # 矩阵乘法第二种
print(d1)

结果:

[[1 1]
 [0 1]]
 ---
[[0 1]
 [2 3]]
 ---
[[0 1]
 [0 3]]
 ---
[[2 4]
 [2 3]]

在这里插入图片描述
在这里插入图片描述

3. 除法
import numpy as np

a = np.array([5, 5, -5, -5])
b = np.array([2, -2, 2, -2])

# 真除
print(a / b)                    # [2.5 -2.5 -2.5 2.5]
print(np.true_divide(a, b))     # [2.5 -2.5 -2.5 2.5]
print(np.divide(a,b))           # [2.5 -2.5 -2.5 2.5]

# 地板除
print(a // b)                     # [ 2 -3 -3  2]
print(np.floor_divide(a, b))    # [ 2 -3 -3  2]

# 天花板除
print(np.ceil(a / b).astype(int))   # [ 3 -2 -2  3]
print(np.ceil(a / b))               # [ 3. -2. -2.  3.]  float
'''
np.ceil(a / b).astype(int)          # float --> int
'''

# 截断除
print((a / b).astype(int))          # [ 2 -2 -2  2]
print(np.trunc(a / b).astype(int))  # [ 2 -2 -2  2]


# 地板除余数
print(a % b)                # [ 1 -1  1 -1]
'''
余数 = 被除数 - 除数 * 商 
  (理论上,对于负数除法,余数会有2个,-7/3:3*(-3)+2;3*(-2)-1 余数:(2,-1))
   对python而言,除法使商尽可能小,
   因此负数除法 -7/3 商会取-3而不是-2,余数取负余数-1  (详情见下文)
'''
print(np.remainder(a, b))   # [ 1 -1  1 -1]
print(np.mod(a, b))         # [ 1 -1  1 -1]

# 截断除余数
print(np.fmod(a, b))        # [ 1  1 -1 -1]
4. 聚合
b = np.arange(4).reshape((2,2))
print(b)
print('求和:',np.sum(b))
print('最大值:',np.max(b))
print('最小值:',np.min(b))

结果:

[[0 1]
 [2 3]]
求和: 6
最大值: 3
最小值: 0

axis 1=行,0=列

b = np.arange(4).reshape((2,2))
print(b)
print('行求和:',np.sum(b,axis=1)) # 每一行的和
print('列最大值:',np.max(b,axis=0)) # 每一列最大值
print('列最小值:',np.min(b,axis=0)) # 每一列最小值

结果:

[[0 1]
 [2 3]]
行求和: [1 5]
列最大值: [2 3]
列最小值: [0 1]

排序:

print("---------------------np.sort()可得升序后的值-------------------------")
import numpy as np
a = np.array([[4, 3, 5], [1, 2, 1]])
[[4 3 5]
 [1 2 1]]

b = np.sort(a, axis=1)  
# axis=1 表示按行排序,默认升序  a 没变
 [[3 4 5]
 [1 1 2]]

print(np.argsort(a)) 
[[1 0 2]
 [0 2 1]]

a.sort(axis=1) # a 变化咯哦
[[3 4 5]
 [1 1 2]]

print("------------np.argsort() 可获取从小到大的值的索引位置-----------------")
a = np.array([4, 3, 1, 2])
j = np.argsort(a)
# argsort 求的是从小到大的值的索引位置,即 j 返回的是索引
print ("j=",j)
print ("a[j]=",a[j])  
# 得出从小到大排序后的值
j= [2 3 1 0]
a[j]= [1 2 3 4]

7. 索引

a = np.arange(3,15).reshape(3,4)
print(a)
print(a[1],a[1,:]) # 第2行
print(a[1][1],a[1,1]) # 2行2列
print(a.flatten) # 铺平的数据 迭代器
for row in a:
    print(row,end='\t') 
print()
for i in a.flat: # a铺平后的迭代器
    print(i,end='\t')

结果:

[[ 3  4  5  6]
 [ 7  8  9 10]
 [11 12 13 14]]
 ---
[ 7  8  9 10] [ 7  8  9 10]
---
8 8
---
<built-in method flatten of numpy.ndarray object at 0x7fe4cc290d00>
---
[3 4 5 6]	[ 7  8  9 10]	[11 12 13 14]	
---
3	4	5	6	7	8	9	10 11 12 13	14

8.合并

a = np.array([1,1,1])
b = np.array([2,2,2])
c = np.vstack((a,b)) # 上下合并 可以指定多个
d = np.hstack((a,b)) # 水平合并 可以指定多个
print(a.shape,c.shape,d.shape) # (3,0) (2,3) (6,)
print(a[np.newaxis,:].shape) # (1,3)
print(a[:,np.newaxis].shape) #(3,1)
print(np.hstack((a[:,np.newaxis],b[:,np.newaxis])))
print(np.hstack((a.reshape((-1,1)),b.reshape((-1,1))))) 
# 同上 结果如下
'''
[[1 2]
 [1 2]
 [1 2]]
'''

更高效的合并方式

a=np.array([[1,2,3],[4,5,6]])
b=np.array([[11,21,31],[7,8,9]])
c=np.concatenate((a,b),axis=0) # 上下合并
print(c.shape) # (4,3)
d=np.concatenate((a,b),axis=1) # 左右合并
print(d.shape) # (2,6)

9.分割

分割 参考
np.split() 均等分割,不均等会报错
np.array_split() 不均等分割,不会报错

split(ary, indices_or_sections, axis=0) :
把一个数组从左到右按顺序切分
参数:

  • ary:要切分的数组
  • indices_or_sections:如果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
  • axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
a = np.arange(12).reshape((3,4))
print(np.split(a,2,axis=1)) # 纵向切割  每一行分成2份 
print(np.hsplit(a,2)) # 同上
print(np.split(a,3,axis=0)) # 横向切割  每一列分成3份
print(np.vsplit(a,3))
print(np.array_split(a,3,axis=1)) # 纵向切割  #第0项分割出来的元素最多,剩下的均等分

结果:

[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
 ---
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2,  3],
       [ 6,  7],
       [10, 11]])]
---
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
---
[array([[0, 1, 2, 3]]), array([[4, 5, 6, 7]]), array([[ 8,  9, 10, 11]])]
---
[array([[0, 1],
       [4, 5],
       [8, 9]]), array([[ 2],
       [ 6],
       [10]]), array([[ 3],
       [ 7],
       [11]])]

10 .深度copy

默认情况下都是 指向的同一个地址区域

a = np.arange(4)
b = a # 指向都是同一个地址存储数据
b[0]=14
print(a)
---
[14  1  2  3]

要实现完全复制

a = np.arange(4)
b = a.copy()
c = a[:]
b[0]=14
c[0]= 12
print(a)
print(b)
print(c)
---
[12  1  2  3]
[14  1  2  3]
[12  1  2  3]

Pandas

pandas是基于NumPy的一种工具,该工具是为了解决数据分析任务而创建的。Pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。pandas提供了大量能使我们快速便捷地处理数据的函数和方法。你很快就会发现,它是使Python成为强大而高效的数据分析环境的重要因素之一。外文名pandas用途Python数据分析模块。主要模块跟概念就是 SeriesDataFrame。参考Excel中的单列数据跟二维数据。

1. 创建

里面有几个主要数据类型,一般就是int,double,str,data。如下创建数据的时候会自动有个行索引,然后还有列名字可设置,主要就参考Excel思维即可。
在这里插入图片描述
常见的创建模式如下:
在这里插入图片描述
类型查看,索引查看,列名查看,数据信息的描述跟整个

在这里插入图片描述
整体数据查看跟排序:
在这里插入图片描述
在这里插入图片描述

2. 查找

一般 用loc、iloc或者ix,目前ix不建议使用。
在这里插入图片描述
在这里插入图片描述

3. 替换

单个元素更高值:
在这里插入图片描述
筛选范围然后赋值:
先找到df1.B > 1的这些行,然后通过df1.B来指定我们要修改那些行的数据。
在这里插入图片描述
在这里插入图片描述

4. 增删

增删 学习 .
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SoWhat1412

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

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

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

打赏作者

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

抵扣说明:

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

余额充值