Numpy使用入门

Jupyter启动jupyter notebookmagic methed运行外部python文件%run /home/nanfengpo/Desktop/bb.py运行计时%time statement 计算代码块的运行时间%timeit statement 计算代码运行的平均时间%%timeit ...
摘要由CSDN通过智能技术生成

Jupyter

启动

jupyter notebook

magic methed

运行外部python文件%run /home/nanfengpo/Desktop/bb.py
运行计时%time statement 计算代码块的运行时间
%timeit statement 计算代码运行的平均时间
%%timeit statement1 statement2 计算多行代码的平均运行速度
查看当前会话中的所有变量和函数%who 查看当前会话的所有变量和函数名称
%whos 查看当前会话的所有变量和函数名称的详细信息
%who_is 返回一个字符串列表,里面元素是当前会话的所有变量与函数名称
执行linux指令在指令前 加 ! 例如 !ls
更多魔法指令lsmagic 列出所有魔法指令

jupyter notebook 快捷键

enter进入编辑模式
shift+enter运行本单元,选中下一单元
Y单元转入代码状态
M单元转入Markdown状态
A在上方插入新单元
B在下方插入新单元
Double-D删除一行
ctrl+enter运行本单元
alt+enter运行本单元,在下面插入一个单元

Numpy

Numpy是python的一种开源的数值计算扩展

  • 强大的N维数组对象Array
  • 丰富的函数库
  • 用户整合C/C++和Fortran代码的工具包
  • 使用的线性代数,傅里叶变换和随机数生成函数
  • numpy和系数矩阵运算包scipy配合使用更加强大

使用方法

创建数组对象
  • 使用np.array() 创建
创建一维array对象
import numpy as np
test = np.array([1,2,3,4,5])
test
输出 array([1, 2, 3, 4, 5])

创建多维array对象
test = np.array([[1,2,3],[4,5,6]])
test
输出 array([[1, 2, 3],
       [4, 5, 6]])
使用np的常规函数创建
数组对象内部参数固定为1

np.ones(shape, dtype=None, order='C')

参数shape是array数组的样式 dtype是数组里参数的类型 order='C'

np.ones([3,3])
输出结果:
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

np.ones([3,3],dtype=int)
输出结果:
array([[1, 1, 1],
       [1, 1, 1],
       [1, 1, 1]])
自定义数组对象内部参数

np.full(shape, fill_value, dtype=None, order='C')

fill_value 是数组对象填充的参数

np.full([3,3],3.14)
输出结果:
array([[ 3.14,  3.14,  3.14],
       [ 3.14,  3.14,  3.14],
       [ 3.14,  3.14,  3.14]])
对角线生成多维数组对象

np.eye(N, M=None, k=0, dtype=float) k参数为便宜

np.eye(4,4)
输出结果:
array([[ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.]])
np.eye(4,4,1)
输出结果:
array([[ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.],
       [ 0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  0.]])
np.eye(4,4,-1)
输出结果:
array([[ 0.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.],
       [ 0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.]])
生成等差数列
(1)指定起始值,结束值,以及需要生成的个数 生成等差数列一维数组

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

start 起始值 stop 结束值 参数num 分成的份数

retstep 为True时 显示步长 endpoint为True时 最后一个值是stop值

等差数列
np.linspace(0,10,5)
输出结果:
array([  0. ,   2.5,   5. ,   7.5,  10. ])
(2)指定起始值,结束值,以及步长 生成等差数列 一维数组

np.arange([start, ]stop, [step, ]dtype=None)

等差数列
np.arange(0,10,2)
输出结果:
array([0, 2, 4, 6, 8])
生成随机数
(1)随机整数一维数组

np.random.randint(low, high=None, size=None, dtype='l')

size是生成的数量

np.random.randint(0,10,5)
输出结果:
array([0, 7, 2, 3, 7])
(2)随机数一维/多维数组

np.random.randn(d0, d1, ..., dn)

#例子
np.random.randn(4,3,2)
输出   从最后一个参数开始  2个数一组   3个组一列   最后 生成4个列 
array([[[-0.75635231,  0.81645401],
        [ 0.75044476, -0.45594693],
        [ 1.18962227, -1.69061683]],

       [[-1.35639905, -1.23243451],
        [-0.54443916, -0.66817174],
        [ 0.00731456, -0.61293874]],

       [[ 1.29974807, -1.73309562],
        [-0.9833101 ,  0.35750775],
        [-1.6135785 ,  1.47071387]],

       [[-1.1880176 , -0.54974619],
        [-0.94004616, -0.82793236],
        [ 0.10886347,  0.50780959]]])
np.random.randn(10)
# 每次每次都不一样
输出结果:
array([-1.74976547,  0.3426804 ,  1.1530358 , -0.25243604,  0.98132079,
        0.51421884,  0.22117967, -1.07004333, -0.18949583,  0.25500144])

np.random.seed(100)#随机的种子,有了种子,每次都一样
np.random.randn(10)

输出结果:
array([ 0.37332715, -0.2887605 ,  0.04985088, -0.93815832, -0.4087037 ,
        1.13352254,  0.52713526, -0.76014192, -0.97292788,  0.16290446])
(3)随机数一维数组

np.random.random(size=None)

np.random.random(3)
array([0.73130075, 0.34038522, 0.0920556 ])
数组的属性
  • ndim 维度
  • shape 各个维度的长度
  • size 总长度
  • dtype 元素类型
数组的操作
索引
np.random.seed(2)
# 随机整数 5个一列 4列一组  生成3组
x = np.random.randint(10,size=[3,4,5])
# 取第3组第1列第1个
print(x[2,0,0])
print(x)
输出
6
[[[8 8 6 2 8]
  [7 2 1 5 4]
  [4 5 7 3 6]
  [4 3 7 6 1]]

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

 [[6 8 5 9 9]
  [9 3 0 0 2]
  [8 8 2 9 6]
  [5 6 6 6 3]]]
切片
一维与列表完全一致 多维时同理
np.random.seed(0)
x = np.random.randint(100,size = (10,4))
x
输出结果:
array([[44, 47, 64, 67],
       [67,  9, 83, 21],
       [36, 87, 70, 88],
       [88, 12, 58, 65],
       [39, 87, 46, 88],
       [81, 37, 25, 77],
       [72,  9, 20, 80],
       [69, 79, 47, 64],
       [82, 99, 88, 49],
       [29, 19, 19, 14]])

切片:
x[7:10]
切片结果:
array([[69, 79, 47, 64],
       [82, 99, 88, 49],
       [29, 19, 19, 14]])
变形
使用reshape函数,注意参数是一个tuple!
x = np.arange(0,16).reshape(4,4)
x

执行结果:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

类型是:
type(x.shape)

tuple
级联

np.concatenate([x,x],axis = 0)

np.concatenate() 级联需要注意的点:
级联的参数是列表:一定要加中括号
维度必须相同
形状相符
【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向
可通过axis参数改变级联的方向np.concatenate() 级联需要注意的点:
级联的参数是列表:一定要加中括号
维度必须相同
形状相符
【重点】级联的方向默认是shape这个tuple的第一个值所代表的维度方向
可通过axis参数改变级联的方向

x = np.array([1,2,3])
y = np.array([1,5,6,7,3,20])
x
输出 array([1, 2, 3])
输出 array([ 1,  5,  6,  7,  3, 20])

z = np.concatenate([x,y])
z
输出 array([ 1,  2,  3,  1,  5,  6,  7,  3, 20])
z.shape
输出 (9,)

/
#二维
x = np.array([[1,2,3],[4,5,6]])
x

array([[1, 2, 3],
       [4, 5, 6]])

x.shape
(2,3)

p = np.concatenate([x,x]).shape
p
(4, 3)

如果增加 axis 参数

个人理解:

加入有两个 shape为 (4,3,2) 的数组级联操作

axis 为0 时 是 最外层的相加 也就4 这个级别

axis为1 时 是第二层的相加 也就是3这一层

axis为2时 是第三层的相加 就是2这一层

下面这个是例子 是 两个 shape为 (2,3,3)的数组的级联操作

import numpy as np
x = np.array([[[1,2,3],[2,2,3],[3,3,3]],[[4,4,4],[5,5,5],[6,6,6]]])
print(x)
print(x.shape)
输出:
[[[1 2 3]
  [2 2 3]
  [3 3 3]]

 [[4 4 4]
  [5 5 5]
  [6 6 6]]]
(2, 3, 3)

w = np.concatenate([x,x],axis = 0)
print(w.shape)
print(w)
输出:
(4, 3, 3)
[[[1 2 3]
  [2 2 3]
  [3 3 3]]

 [[4 4 4]
  [5 5 5]
  [6 6 6]]

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

w = np.concatenate([x,x],axis = 1)
print(w.shape)
print(w)
输出:
(2, 6, 3)
[[[1 2 3]
  [2 2 3]
  [3 3 3]
  [1 2 3]
  [2 2 3]
  [3 3 3]]

 [[4 4 4]
  [5 5 5]
  [6 6 6]
  [4 4 4]
  [5 5 5]
  [6 6 6]]]
/
w = np.concatenate([x,x],axis = 2)
print(w.shape)
print(w)

输出:
(2, 3, 6)
[[[1 2 3 1 2 3]
  [2 2 3 2 2 3]
  [3 3 3 3 3 3]]

 [[4 4 4 4 4 4]
  [5 5 5 5 5 5]
  [6 6 6 6 6 6]]]

水平级联和垂直级联

np.hstack 水平级联

np.vstack 垂直级联

x = np.array([[1,1],[2,2],[3,3]])
y = np.array([1,2,3])
print(np.hstack(x))
print(np.vstack(y))

输出:
[1 1 2 2 3 3]
[[1]
 [2]
 [3]]
切分

(1)np.split()

np.split(ary, indices_or_sections, axis=0)

x = np.arange(1,10)
array([1, 2, 3, 4, 5, 6, 7, 8, 9])
x1,x2,x3 = np.split(x,[3,5])  #[3,5] 是索引位置
print(x1,x2,x3)
输出:
[1 2 3] [4 5] [6 7 8 9]
___________________________
x1,x2,x3,x4 = np.split(x,[1,4,6])
print(x1,x2,x3,x4)
输出:
[1] [2 3 4] [5 6] [7 8 9]
____________________________
x = np.arange(3,10)
x
输出: array([3, 4, 5, 6, 7, 8, 9])
x1,x2,x3,x4 = np.split(x,[1,3,5])
print(x1,x2,x3,x4)
输出:[3] [4 5] [6 7] [8 9]

(2)np.hsplit()

垂直切分

x = np.arange(16).reshape(4,4)
x
输出:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

print(np.hsplit(x,[2,3])) 
# [2,3] 是切的位置  2 为 0,1 |4,5| 8,9 | 12,13
# 3为 2 6 10 14
输出:
[array([[ 0,  1],[ 4,  5], [ 8,  9], [12, 13]]),
         array([[ 2],  [ 6],  [10], [14]]), 
         array([[ 3],  [ 7],  [11],  [15]])]

(3)np.vsplit()

横切

x = np.arange(16).reshape(4,4)
x
输出:
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])
# 横切  把 1,2 两行 切到一组   第3行切为一组  剩余的为一组
print(np.vsplit(x,[2,3]))
输出:
[array([[0, 1, 2, 3],
        [4, 5, 6, 7]]), array([[ 8,  9, 10, 11]]), array([[12, 13, 14, 15]])]
副本

所有赋值运算不会为ndarray的任何元素创建副本。对赋值后的对象的操作也对原来的对象生效

a = np.array([1,2,3])
b=a
print(a,b)
输出:
[1 2 3] [1 2 3]

b[0]=2
a
输出:
array([2, 2, 3])

可使用copy()函数创建副本

a = np.array([1,2,3])
b = a.copy()
b
输出:
[1,2,3]

b[0]=3
print(a,b)
输出:
[1 2 3] [3 2 3]
聚合操作
  • 求和np.sum()
x = np.arange(4)
np.sum(x)
输出 6
  • 最大最小值:np.max/ np.min
  • 求平均值 np.mean(heights)
  • 计算标准差 heights.std()
矩阵操作
  • 基本操作 加减乘除
a = np.array([[1,2,3],
[4,5,6]])
a
输出:
array([[1, 2, 3],
       [4, 5, 6]])
a+1
输出:
array([[2, 3, 4],
       [5, 6, 7]])
a*2
输出:
array([[ 2,  4,  6],
       [ 8, 10, 12]])

a+[[1,4,9],[3,3,3]]
输出:
array([[ 2,  6, 12],
       [ 7,  8,  9]])

a*2-2
输出:
array([[ 0,  2,  4],
       [ 6,  8, 10]])
  • 矩阵积

    A*B

    A的横排去乘B的竖排 按顺序去乘即可

  • 广播机制

【重要】ndarray广播机制的两条规则
规则一:为缺失的维度补1
规则二:假定缺失元素用已有值填充

例子

a = np.ones((4,1))
a 
输出: 
    array([[1.],
       [1.],
       [1.],
       [1.]])
b = np.arange(4)
b
输出:
    array([0, 1, 2, 3])

a + b    
a 实际上变成了 
    array([[1.,1,1,1],
       [1.,1,1,1],
       [1.,1,1,1],
       [1.,1,1,1]])
这个就是规则1 给缺失的维度补1
而b变成了
        array([[0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3],
       [0, 1, 2, 3]])
这个就是规则2 假定缺失元素用已有值填充

因此 a+b的值 输出为

array([[1., 2., 3., 4.],
       [1., 2., 3., 4.],
       [1., 2., 3., 4.],
       [1., 2., 3., 4.]])
排序
  • 快速排序

np.sort()与ndarray.sort()都可以,但有区别:
np.sort()不改变输入
ndarray.sort()本地处理,不占用空间,但改变输入

  • 部分排序

np.partition(a,k) #参数1是数组 参数2是要的个数

当k为正数时 要最小的k个 数 这几个数在数组前k个

当k为负数时 要最大的k个 数 这几个数在数组后k个

有的时候我们不是对全部数据感兴趣,我们可能只对最小或最大的一部分感兴趣。
当k为正时,我们想要得到最小的k个数
当k为负时,我们想要得到最大的k个数

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值