本篇主要收集一些平时见到的 Numpy 函数。

numpy.random.seed & numpy.random.RandomState

np.random.seed()np.random.RandomState 都用于生成随机数种子,np.random.seed() 是可以直接调用的方法,而 np.random.RandomState 则是一个产生随机数的容器,使用时需要创建实例对象,进而调用实例方法,如 np.random.RandomState(42).uniform()

随机数种子 seed 只有一次有效,在下一次调用产生随机数函数前没有设置 seed,则还是产生随机数。如果需要每次都产生随机数,则可以将随机数seed设置成None,或者不设置。

>>> import numpy as np

>>> np.random.seed(42)
>>> np.random.randint(1, 10, 5) # array([5, 1, 2, 6, 1]) >>> np.random.seed(42)
>>> np.random.randint(1, 10, 5) # array([5, 1, 2, 6, 1]) >>> np.random.randint(1, 10, 5) # array([8, 8, 3, 6, 5])
>>> from numpy.random import RandomState

>>> r = RandomState(42)
>>> r.randint(1, 10, 5) # array([9, 9, 7, 3, 9]) >>> r = RandomState(42)
>>> r.randint(1, 10, 5) # array([9, 9, 7, 3, 9]) >>> r = RandomState(None)
>>> r.randint(1, 10, 5) # array([8, 3, 2, 6, 5])
>>> import random  # 使用Python的Random模块
>>> random.seed(42)
>>> random.sample(range(10), 5) # [1, 0, 4, 9, 6] >>> random.sample(range(10), 5) # [6, 9, 1, 4, 5]

numpy.tile

numpy.tile(A, n) 用于将一整个数组 A 重复 n 次。 下面是一个简单的例子:

>>> a = [1,2,3,4]
>>> np.tile(a, 3) # array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])

然而如果 n 的长度大于 1,则情况就略复杂了。下面看个例子:

>>> a = np.array([1,2,3])
>>> np.tile(a, (3, 3)) array([[1, 2, 3, 1, 2, 3, 1, 2, 3],
[1, 2, 3, 1, 2, 3, 1, 2, 3],
[1, 2, 3, 1, 2, 3, 1, 2, 3]])

上面的原始数组 a 为一维,n 的长度为 2,则 tile 函数会将原来的一维拓展为 2 维,再在每一维上重复相应的数组,相当于下面两步:

>>> a = np.array([1,2,3])
>>> a = np.expand_dims(a, axis=0)
# a 为 array([[1, 2, 3]])
>>> np.tile(a, (3, 3))

上面的情况是 n 的长度大于 a 的维度,另一种情况是 n 的长度小于 a 的维度:

>>> b = np.array([[1,2,3], [4,5,6]])
>>> np.tile(b, 2) array([[1, 2, 3, 1, 2, 3],
[4, 5, 6, 4, 5, 6]])

上面的情况是 b 的维度为 2,n 的长度为1,则同样 n 会被扩展为 2,不足的维度用 1 填充,即变成 (1, 2),所以上例中 b 的第一维没有被复制,被复制的是第二维。最后按惯例是一个复杂点的例子:

>>> c = np.arange(27).reshape((3,3,3))
array([[[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8]], [[ 9, 10, 11],
[12, 13, 14],
[15, 16, 17]], [[18, 19, 20],
[21, 22, 23],
[24, 25, 26]]]) >>> np.tile(c, (2,2,2))
array([[[ 0, 1, 2, 0, 1, 2],
[ 3, 4, 5, 3, 4, 5],
[ 6, 7, 8, 6, 7, 8],
[ 0, 1, 2, 0, 1, 2],
[ 3, 4, 5, 3, 4, 5],
[ 6, 7, 8, 6, 7, 8]], [[ 9, 10, 11, 9, 10, 11],
[12, 13, 14, 12, 13, 14],
[15, 16, 17, 15, 16, 17],
[ 9, 10, 11, 9, 10, 11],
[12, 13, 14, 12, 13, 14],
[15, 16, 17, 15, 16, 17]], [[18, 19, 20, 18, 19, 20],
[21, 22, 23, 21, 22, 23],
[24, 25, 26, 24, 25, 26],
[18, 19, 20, 18, 19, 20],
[21, 22, 23, 21, 22, 23],
[24, 25, 26, 24, 25, 26]], [[ 0, 1, 2, 0, 1, 2],
[ 3, 4, 5, 3, 4, 5],
[ 6, 7, 8, 6, 7, 8],
[ 0, 1, 2, 0, 1, 2],
[ 3, 4, 5, 3, 4, 5],
[ 6, 7, 8, 6, 7, 8]], [[ 9, 10, 11, 9, 10, 11],
[12, 13, 14, 12, 13, 14],
[15, 16, 17, 15, 16, 17],
[ 9, 10, 11, 9, 10, 11],
[12, 13, 14, 12, 13, 14],
[15, 16, 17, 15, 16, 17]], [[18, 19, 20, 18, 19, 20],
[21, 22, 23, 21, 22, 23],
[24, 25, 26, 24, 25, 26],
[18, 19, 20, 18, 19, 20],
[21, 22, 23, 21, 22, 23],
[24, 25, 26, 24, 25, 26]]])

最后出来的结果其实非常具有对称的美感。

另外与 numpy.tile() 有密切联系的函数为 numpy.repeat() ,其功能是对应元素重复:

>>> np.repeat(13, 5)   # array([13, 13, 13, 13, 13])

numpy.repeat() 可以制定要重复的轴 (axis),但如果不指定,则将原数组拉伸为 1 维数组后再对应元素重复:

>>> a = np.array([[1,2], [3,4]])
>>> np.repeat(a, 3) # array([1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4]) >>> np.repeat(a, 3, axis=1)
array([[1, 1, 1, 2, 2, 2],
[3, 3, 3, 4, 4, 4]])

numpy.unique

numpy.unique() 的基本用法比较简单,用于返回数组中所有不重复的元素组成的列表 L :

>>> a = np.array([1,2,3,1,2,3,4,5])
>>> L = np.unique(a)
array([1, 2, 3, 4, 5])

numpy.unique() 另外附带了三个有用的附加操作,灵活运用可有奇效:

  • return_index 用于返回原数组中元素的索引 (index)
  • return_inverse 用于返回原数组元素在列表 L 中的索引 (index)
  • return_counts 用于返回原数组中各个不重复元素的出现次数
# 计算数组中各个元素的出现次数,并以字典形式返回,和 python 自带的 collections.Counter() 进行效率比较
from collections import Counter
>>> a = np.random.randint(0, 10, 10000)
>>> %timeit dict(Counter(a))
1.54 ms ± 46.6 µs per loop
>>> %timeit c = dict(zip(*np.unique(a, return_counts=True)))
229 µs ± 1.76 µs per loop
>>> c
{0: 1003,
1: 1013,
2: 1023,
3: 975,
4: 1019,
5: 956,
6: 979,
7: 996,
8: 1001,
9: 1035}
# 将数组按不重复元素进行切分成多个子数组,返回每个子数组中元素在原数组中的索引。用于按类别分割数据,scikit-learn 中的 StratifiedShuffleSplit 和 StratifiedKFold 的实现也是基于此。
>>> a = np.random.randint(0, 3, 20)
>>> a
array([2, 2, 2, 2, 2, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0])
>>> classes, y_indices, class_counts = np.unique(labels, return_inverse=True, return_counts=True)
>>> classes, y_indices, class_counts
array([0, 1, 2])
array([2, 2, 2, 2, 2, 1, 0, 1, 1, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0]),
array([6, 9, 5]) >>> class_indices = np.split(np.argsort(y_indices), np.cumsum(class_counts)[:-1])
>>> class_indices
[array([ 9, 16, 14, 10, 6, 19]),
array([ 7, 8, 18, 11, 12, 13, 15, 17, 5]),
array([4, 3, 2, 1, 0])]

np.argsort() 默认使用的是快速排序,具有不稳定的缺点;若使用归并排序,每个子数组中元素都会保留原来的顺序:

>>> class_indices = np.split(np.argsort(y_indices, kind="mergesort"), np.cumsum(class_counts)[:-1])
>>> class_indices
[array([ 6, 9, 10, 14, 16, 19]),
array([ 5, 7, 8, 11, 12, 13, 15, 17, 18]),
array([0, 1, 2, 3, 4])]

numpy.average

numpy.average()numpy.mean() 的区别是 numpy.average() 可以计算加权平均:

>>> data = np.arange(6).reshape((3,2))
>>> data
array([[0, 1],
[2, 3],
[4, 5]])
>>> np.average(data, axis=1, weights=[1./4, 3./4])
array([ 0.75, 2.75, 4.75])

numpy.roll

numpy.roll(a, shift, axis=None) 用于沿着指定的 axis 滚动数组元素。若不指定 axis,则所有元素依次滚动:

>>> x = np.arange(10).reshape(2,5)
>>> x
array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> np.roll(x, shift=1)
array([[9, 0, 1, 2, 3],
[4, 5, 6, 7, 8]])
>>> np.roll(x, shift=1, axis=0)
array([[5, 6, 7, 8, 9],
[0, 1, 2, 3, 4]])
>>> np.roll(x, shift=1, axis=1)
array([[4, 0, 1, 2, 3],
[9, 5, 6, 7, 8]])

/

Numpy 函数总结 (不断更新)的更多相关文章

  1. numpy函数笔记(持续更新)

    numpy函数笔记 np.isin用法 np.isin(a,b) 用于判定a中的元素在b中是否出现过,如果出现过返回True,否则返回False,最终结果为一个形状和a一模一样的数组.(注意:这里的a ...

  2. Numpy函数库基础

    利用Numpy函数库构造4*4随机数组,然后将数组转化为矩阵,然后矩阵与其逆矩阵相乘,计算机处理的误差 from numpy import * random.rand(4,4) print(rando ...

  3. [转]Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate()

    Python numpy函数hstack() vstack() stack() dstack() vsplit() concatenate() 觉得有用的话,欢迎一起讨论相互学习~Follow Me ...

  4. numpy函数库中一些经常使用函数的记录

    ##numpy函数库中一些经常使用函数的记录 近期才開始接触python,python中为我们提供了大量的库,不太熟悉.因此在<机器学习实战>的学习中,对遇到的一些函数的使用方法进行记录. ...

  5. numpy函数库中一些常用函数的记录

    ##numpy函数库中一些常用函数的记录 最近才开始接触Python,python中为我们提供了大量的库,不太熟悉,因此在<机器学习实战>的学习中,对遇到的一些函数的用法进行记录. (1) ...

  6. 解决vscode+python不提示numpy函数的问题

    前言 使用vscode编写numpy代码时,对于numpy.array()等方法总是无法提示.查找了很多博客后,大部分都是修改配置和安装多种vscode插件,经过尝试后方法对于我来说无效.最后在调试p ...

  7. numpy 函数一:linspace

    接触 numpy 遇到的第一个函数可能就是 linspace 函数,但是对于我们这种没有学过 matlab 的人来说,根本不知道这是什么. 所以只能自己查资料. 词典显示: 线性等分向量 线性平分矢量 ...

  8. numpy函数白板

    numpy.linspace(start, stop, num=50, endpoint=True, retstep=False) start 起始位置 stop 终止位置 num 个数 endpoi ...

  9. numpy函数fromfunction分析

    从函数规则创建数组是非常方便的方法.在numpy中我们常用fromfunction函数来实现这个功能. 在numpy的官网有这么一个例子. >>> def f(x,y): ... r ...

随机推荐

  1. Codeforces Round #528 div1

    完了,看来上一次的flag要应验了,我大概是真的要掉成pupil了吧.. A - Connect Three 这个就是找到x的中间值,y的中间值,然后切一下,然后把所有的点挂到这条边上.但是我做的还是 ...

  2. Sql Server 创建表添加说明

    http://bbs.csdn.net/topics/340184487 在此感谢 提供参考 CREATE TABLE ToPayFee (    Id INT IDENTITY(1,1) PRIMA ...

  3. HDU 6069 Counting Divisors(唯一分解定理+因子数)

    http://acm.hdu.edu.cn/showproblem.php?pid=6069 题意: 思路: 根据唯一分解定理,$n={a_{1}}^{p1}*{a2_{}}^{p2}...*{a_{ ...

  4. 机器学习 MLIA学习笔记(二)之 KNN算法(一)原理入门实例

    KNN=K-Nearest Neighbour 原理:我们取前K个相似的数据(排序过的)中概率最大的种类,作为预测的种类.通常,K不会大于20. 下边是一个简单的实例,具体的含义在注释中: impor ...

  5. JavaMai——邮箱验证用户注册

    这篇文章简单的模拟了网上利用邮箱激活用户注册这样的一个功能 1. 呈现给用户的注册界面:(为了简单起见,就剩下两个输入域,邮箱和昵称) <%@ page language="java& ...

  6. 【转】DrawDibDraw

    http://blog.csdn.net/normallife/article/details/53177315 BMP位图文件结构及平滑缩放 用普通方法显示BMP位图,占内存大,速度慢,在图形缩小时 ...

  7. 工程优化暨babel升级小记

    小记背景 随着业务代码的增多,项目代码的编译时长也在增多,遂针对这个痛点在dev下做些优化 第一部分:优化dev编译时间 这里优化的主要思路是在dev环境下,单独出来一个dll配置文件,将项目中的部分 ...

  8. 关于网站的SYN_RECV(SYN_RECEIVED)***的防范措施

    关于网站的SYN_RECV(SYN_RECEIVED)***的防范措施 一.总结 一句话总结:SYN ***是最常见又最容易被利用的一种***手法.相信很多人还记得2000年YAHOO网站遭受的*** ...

  9. js中文乱码

    js中文乱码 我的页面是uft-8,处理中文还是乱码, 所在在处理页面增加了 request.setCharsetEncoding("UFT-8"); ////////////// ...

  10. 什么是SQL游标?

    1.1游标的概念 游标(Cursor)它使用户可逐行访问由SQL Server返回的结果集.使用游标(cursor)的一个主要的原因就是把集合操作转换成单个记录处理方式.用SQL语言从数据库中检索数据 ...