python中需要在一定区间内进行采样,或是对生成的数据进行采样,可以利用随机模块random.sample()函数或者numpy.random.choice()函数实现。

1.随机采样

如果需要对某个区间内的数进行随机采样,可以使用random.sample()来实现。
random.sample(N, m)函数主要有两个参数,分别是需要采样的序列N和需要采样的样本个数m。

import random
N = range(10)
m = 3
a = random.sample(N, m)
print(a)
# 从0~9的序列中采样了3个样本
>>> [0, 5, 8]

numpy中的随机数模块同样可以进行采样,可以利用numpy.random.choice()函数实现。numpy.random.choice(a, size=None, replace=True, p=None)主要有四个参数,其中a为一维待采样序列,size为采样样本数目,replace代表是否重复采样p如果设置的话与a等长代表序列中每个位置的采样概率。

import numpy as np
N = range(10)
m = 3
a = np.random.choice(N, size=3)
b = np.random.choice(N, size=6)
c = np.random.choice(N, size=9)
print("a:",a)
print("b:",b)
print("c:",c)
#输出结果
>>>
'a:', array([5, 9, 7])
'b:', array([5, 5, 1, 3, 4, 3])
'c:', array([5, 8, 4, 4, 0, 4, 8, 2, 2])   # 可以看到这里有重复的采样数字#----- 不重复采样,需要设置replace -----#
a = np.random.choice(N, size=3, replace=False)
b = np.random.choice(N, size=6, replace=False)
c = np.random.choice(N, size=9, replace=False)
print("a:",a)
print("b:",b)
print("c:",c)
#输出结果
>>>
a = np.random.choice(N, size=3, replace=False)
b = np.random.choice(N, size=6, replace=False)
c = np.random.choice(N, size=9, replace=False)
print("a:",a)
print("b:",b)
print("c:",c)
>>>
'a:', array([7, 5, 3])
'b:', array([3, 7, 4, 8, 9, 1])
'c:', array([2, 1, 7, 6, 0, 5, 9, 4, 3])  #----- 设置采样概率p -----#
c = np.random.choice(N, size=9, p=[0.1,0.1,0.01,0.1,0.09,0.01,0.4,0.09,0.05,0.05])  #6的位置概率最大
print('c:', c)
>>>
'c:', array([6, 7, 0, 3, 6, 6, 6, 4, 3])      #可以看到6出现的概率明显增加

2.二维采样

有的时候我们还需要进行二维采样,例如对一个表面进行采样、对图像进行采样、或者对深度进行采样,这在图像处理中十分有用。下面用一个二维曲面的采样作为例子进行说明。

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D# make datas, generate surface
surface_range = 2*np.pi  # range of surface
num = 128    #x,y number point
x = np.linspace(-surface_range, surface_range, num)
y = np.linspace(-surface_range, surface_range, num)
[X, Y] = np.meshgrid(x,y)Z = np.sin(X) + np.sin(Y) + 1e-3   # generated surface# draw surface
fig = plt.figure()
ax = fig.gca(projection='3d')
# Plot the surface.
surf = ax.plot_surface(X, Y, Z,cmap='plasma', rstride = 1, cstride = 1)
plt.show()


随后我们在这个表面上采样500个点,使用nump.random.choice()进行。

samp_nums = 500
surface_list = range(Z.size)
samp_list = np.random.choice(surface_list, samp_nums, replace=False)    # 从Z所有的表面点中选取500个采样点
print(len(samp_list))
# 选出了samp_nums个采样点
>>> 500# 将采样值作为surface索引值进行采样
samp_1D_array = np.zeros(Z.size)  # 1.首先构建一个长度为曲面点数目的一维序列
samp_1D_array[samp_list] = 1      # 2.随后将一维序列中的采样位置设置为1
samp_2D_array = np.reshape(samp_1D_array, Z.shape) # 随后转换为与曲面相同尺寸的采样矩阵
sample_surface = Z * samp_2D_array                 # 最后进行采样,得到采样后曲面

# 如果想要得到逐个采样点,可以从X,Y,Z中读取相应位置的值
sample_Z = Z[np.where(samp_2D_array==1)]
sample_Y = Y[np.where(samp_2D_array==1)]
sample_X = X[np.where(samp_2D_array==1)]fig = plt.figure()
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z,cmap='plasma', rstride = 1, cstride = 1)
ax.scatter3D(sample_X,sample_Y,sample_Z,zdir='z',c='r')
plt.show()

采样点和被采样表面:

最终就可以完成采样。如果还需要进行插值可以参考scipy.interpolate.griddata()函数。

ref:
Fancy Index:https://jakevdp.github.io/PythonDataScienceHandbook/02.07-fancy-indexing.html random:https://blog.csdn.net/qq_32364939/article/details/78443751 random.sample:https://blog.csdn.net/sunnyyan/article/details/83410233 np.random:https://blog.csdn.net/zsc201825/article/details/80918450 np.random.choice:https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.random.choice.html
python standard libs:https://docs.python.org/3.4/library/index.html
matplotlib scatter:https://matplotlib.org/mpl_examples/mplot3d/scatter3d_demo.py
https://blog.csdn.net/Scc_hy/article/details/81455795
https://www.zhihu.com/question/46673934/answer/102286003
colormap:https://matplotlib.org/3.1.1/gallery/color/colormap_reference.html
matplotlib palettable: https://jiffyclub.github.io/palettable/



pic from pexels.com

【python】随机采样的两种方法相关推荐

  1. python使用方法视频-Python读取视频的两种方法(imageio和cv2)

    用python读取视频有两种主要方法,大家可依据自己的需求进行使用. 方法一: 使用imageio库,没有安装的可用pip安装或自己下载,安装好后重启终端即可调用. import pylab impo ...

  2. python遍历数组的两种方法及将print的内容写入文件中

    python遍历数组的两种方法 第一种,最常用的,通过for in遍历数组 colours = ["red","green","blue"] ...

  3. python3(4)--- python遍历数组的两种方法

    python遍历数组的两种方法 第一种,最常用的,通过for in遍历数组.其实本质就是取出来的是这个数组或者列表中的元素,和角标无关. colours = ["red",&quo ...

  4. python遍历数组的两种方法的代码

    工作过程中,把开发过程中较好的一些内容段备份一下,下面内容是关于python遍历数组的两种方法的内容,希望对小伙伴有用途. colours = ["red","green ...

  5. python列表去重的两种方法

    python列表去重的两种方法 1. 使用循环进行遍历,将重复的元素去掉. def test1():lst = [1,2,5,6,3,5,7,3]tmp = []for it in lst:if it ...

  6. c#产生随机字符串的两种方法

    // c#产生随机字符串的两种方法 using System; using System.Data; using System.Linq; using System.Windows.Forms;nam ...

  7. 产生随机字符java_java生成随机字符串的两种方法

    本文实例为大家分享了java生成随机字符串的具体代码,供大家参考,具体内容如下 import java.util.Random; public class CharacterUtils { //方法1 ...

  8. python怎么导入视频-Python读取视频的两种方法(imageio和cv2)

    用python读取视频有两种主要方法,大家可依据自己的需求进行使用. 方法一: 使用imageio库,没有安装的可用pip安装或自己下载,安装好后重启终端即可调用. import pylab impo ...

  9. python list排序的两种方法及实例讲解

    对List进行排序,Python提供了两个方法 方法1.用List的内建函数list.sort进行排序 list.sort(func=None, key=None, reverse=False) Py ...

最新文章

  1. matlab多元回归程序,多元回归程序MATLAB程序
  2. python开发工程师面试题-分析经典Python开发工程师面试题
  3. 汉诺塔--(数据结构)
  4. 你不得不看的六篇知识图谱落地好文
  5. 苹果cmsV10高仿草民电影网在线影视网站模板 带手机版
  6. c++去除图片上的文字_图片文字修改去除方法
  7. java web 数据库操作_Java Web----Java Web的数据库操作(三)
  8. aliez歌词_aLIEz (中文版)歌词
  9. Excel自动获取单词音标词义
  10. SQLITE测试工具
  11. linux关于系统管理、系统安全命令
  12. 计算机视觉学习6_棋盘格_相机模型与参数标定
  13. 数据传输加密——非对称加密算法RSA+对称算法AES(适用于java,android和Web)
  14. 遗传算法(进化类算法)中的选择,交叉,变异等一系列问题解析(二)
  15. android - 【记录】三星手机(N9002)刷机、官方系统、TWRP
  16. java 常用 函数式接口_「java8系列」神奇的函数式接口
  17. SQL sever 数据库数据类型
  18. PCB工艺设计规范-01
  19. 最大似然估计与最大后验概率的区别与联系
  20. 2018杭州云栖大会,有哪些科技惊喜?

热门文章

  1. C++:函数指针,回调函数
  2. 右键文件夹电脑卡死?
  3. 太原理工微型计算机控制试卷,太原理工大学微机原理考试(13届葬仪落整理).docx...
  4. vantUI组件:van-card 自定义内容 - 踩坑篇
  5. WebStorm 常用快捷键大全 - 归纳总结篇
  6. java request 处理过程_小猿圈Java开发之从代码看spring mvc请求处理过程
  7. python画画加粗_Matplotlib'粗体'字体 - python
  8. wordpress主题-响应式CUI2.0翠竹林博客主题wordpress模板分享
  9. PHP二开美化版站长技术导航网站源码
  10. 哈工程计算机学院培养方案,哈工程2012年硕士培养方案详解(计算机科学与技术学院).doc...