numpy教程

防止输出省略号

  1. import numpy as np
  2. np.set_printoptions(threshold=np.inf)

广播机制

numpy计算函数返回默认是一维行向量:

  1. import numpy as np
  2.  
  3. a = [[1,1,1],
  4. [2,2,2],
  5. [3,3,3]]
  6. b = (np.sum(a,axis=1))
  7. c = (np.sum(a,axis=0))
  8. print(b,'\n',c)
  9.  
  10. # [3 6 9]
  11. # [6 6 6]

所以广播之实际是高维对一维行向量的广播:

除法广播:

  1. b = a/(np.sum(a,axis=1))
  2. c = a/(np.sum(a,axis=0))
  3. print(b,'\n',c)
  4.  
  5. # [[ 0.33333333 0.16666667 0.11111111]
  6. # [ 0.66666667 0.33333333 0.22222222]
  7. # [ 1. 0.5 0.33333333]]
  8. # [[ 0.16666667 0.16666667 0.16666667]
  9. # [ 0.33333333 0.33333333 0.33333333]
  10. # [ 0.5 0.5 0.5 ]]

向量乘法,加法可以类比:

  1. np.array([1,2,3])*np.array([1,1,1])
  2. # [1 2 3]
  3.  
  4. np.array([1,2,3])*np.array([1])
  5. # [1 2 3]
  6.  
  7. np.array([1,2,3])*np.array([1,1])
  8. # 报错
  9.  
  10. np.array([[1],[1],[1]])*np.array([1,2,3])
  11. # [[1 2 3]
  12. # [1 2 3]
  13. # [1 2 3]]

线性代数相关

np.diag():对角阵生成

np.linalg.det():求行列式

np.linalg.inv():矩阵求逆

np.linalg.eig():对称阵特征值分解

np.linalg.svd():任意阵SVD分解

通用函数

使单输入单输出的函数具备广播功能,frompyfunc(fun, in_num, out_num),常用f = frompyfunc(fun, 1, 1)

  1. >>> oct_array = np.frompyfunc(oct, 1, 1)
  2.  
  3. >>> oct_array(np.array((10, 30, 100)))
  4. array([012, 036, 0144], dtype=object)
  5.  
  6. >>> np.array((oct(10), oct(30), oct(100))) # for comparison
  7. array(['012', '036', '0144'],
  8. dtype='|S4')

np.sum(array1 == array2,dtype=float)

bool转换为数组默认是整形,需要手动修改为浮点型,比较值得注意的tip,或者说由于python本身不做区分,所以在numpy中必须特别注意数字类型的问题

取整

np.rint(result) # 四舍五入
np.ceil(result) # 向上取整
np.floor(result) # 向下取整

np.unique()

保留数组中不同的值

  1. >>> a=np.random.randint(0,5,8)
  2. >>> a
  3. array([2, 3, 3, 0, 1, 4, 2, 4])
  4.  
  5. >>> np.unique(a)
  6. array([0, 1, 2, 3, 4])
  7.  
  8. >>> c,s=np.unique(b,return_index=True)
  9. >>> c
  10. array([0, 1, 2, 3, 4])
  11. >>> s
  12. array([3, 4, 0, 1, 5])(元素出现的起始位置)

np.full((shape), value, type)

numpy数组初始化函数

np.split(array, num)

把数组顺序等分

np.fun.at(array, index_array, [array2])

fun需要一个参数时等价np.fun(array[index_array]),多参数用法如下:

Examples

Increment items 0 and 1, and increment item 2 twice:

  1. >>> a = np.array([1, 2, 3, 4])
  2. >>> np.add.at(a, [0, 1, 2, 2], 1)
  3. >>> print(a)
  4. array([2, 3, 5, 4])

Add items 0 and 1 in first array to second array, and store results in first array:

  1. >>> a = np.array([1, 2, 3, 4])
  2. >>> b = np.array([1, 2])
  3. >>> np.add.at(a, [0, 1], b)
  4. >>> print(a)
  5. array([2, 4, 3, 4])

特色,

  1. #np.add.at(dW, x, dout)
  2. #dW[x] += dout # this will not work, see the doc of np.add.at
  3. a = np.array([1,2,3,4,5,6,7])
  4. i = np.array([0,1,2,0,1])
  5. b = np.array([1,2,3,4,5])
  6. np.add.at(a, i, b)
  7. print(a)
  8. a = np.array([1,2,3,4,5,6,7])
  9. i = np.array([0,1,2,0,1])
  10. b = np.array([1,2,3,4,5])
  11. a[i] += b
  12. print(a)

输出如下,即索引重复的时候,只有np.add.at会累积前面的结果,单纯的索引会取最后一次的结果覆盖,

[6 9 6 4 5 6 7]

[5 7 6 4 5 6 7]

np.save() & np.load()

  1. np.save('./bottleneck/{1}/{0}'.format(img.split('/')[-1].split('.')[0], file_name),bottleneck_values)
  1. bottleneck_string = np.load(os.path.join(base_path,
    'bottleneck',
    train_or_test,
    label_name,
    bottlenecks_tensor_name))

np.loadtxt()

  1. # 本函数读取数据后自动转化为ndarray数组,可以自行设定分隔符delimiter=","
  2. np.loadtxt('housing.data') # 读取数据

np.insert()

  1. np.insert(scale_data, 0, 1, axis=1) # 数组插入函数

  在数组中插入指定的行列,numpy.insert(arr, obj, values, axis=None),和其他数组一样,axis不设定的话会把数组定为一维后插入,axis=0的话行扩展,axis=1的话列扩展

np.matrix()

『科学计算_理论』优化算法:梯度下降法&牛顿法

学习了numpy中的矩阵类型:np.matrix(),在牛顿法中我用的是matrix,在梯度下降法中我用的是array:

matrix是array的子类,特点是有且必须只是2维,matrix.I()可以求逆,和线代的求逆方法一致,所以绘图时我不得不才用np.sequeeze(np.asarray())操作来降维,而由于x[:, -1]这种操作对array会自动降维(由两行变为一行),所以要么使用matrix,要么切片后reshape(2,1),总之不消停。

np.concatenate()

『科学计算_理论』优化算法:梯度下降法&牛顿法

注意到数组拼接方法都是不破坏原数组,单纯返回新数组的,且axis=0是行拼接(行数增加),axis=1是列拼接(列数增加),

x_n = np.concatenate((x_n, x_n[:,-1] - np.linalg.inv(H).dot(dx_n)),axis=1)

np.nxis

np.exped_dim

用于扩展维度,numpy不仅有expend_dim这样的函数,也可以使用np.newaxis标记来实现扩维:

  1. a = np.array([1,2,3,4,5])
  2. a = a[:,np.newaxis]
  3. a
  4. Out[44]:
  5. array([[1],
  6. [2],
  7. [3],
  8. [4],
  9. [5]])
  10. a = np.array([1,2,3,4,5])
  11. a = a[np.newaxis,:]
  12. a
  13. Out[47]:
  14. array([[1, 2, 3, 4, 5]])

array.transpose(1,0,2)

转置,1维没效果(并不能行列互化),高维后面参数维转置顺序,假如(T,N,H)经过上面的命令会变为(N,T,H)

np.bincount()

计数&投票函数

numpy.bincount详解

np.maximum(X, Y, out=None):

    • X 与 Y 逐位比较取其大者;
    • 最少接收两个参数

np.squeeze():剔除长度为一的轴

  1. np.squeeze(np.array([[1,2,3]]))
  2. # Out[17]:
  3. # array([1, 2, 3])
  4. np.squeeze(np.array([[1],[2],[3]]))
  5. # Out[18]:
  6. # array([1, 2, 3])

numpy.roll():平移数组行列

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

计算机视觉中人为建立图像抖动会使用这个函数:

『cs231n』作业3问题4选讲_图像梯度应用强化

  1. ox, oy = np.random.randint(-max_jitter, max_jitter+1, 2) # 随机抖动生成
  2. X = np.roll(np.roll(X, ox, -1), oy, -2) # 抖动,注意抖动不是随机噪声
  3.  
  4. pass
  5.  
  6. X = np.roll(np.roll(X, -ox, -1), -oy, -2) # 还原抖动

『Numpy』常用方法记录的更多相关文章

  1. 『Json』常用方法记录

    json模块可以把字典结构改写为string然后保存,并可以反向读取字典 pickle模块则可以持久化任意数据结构 但是即使同样是字典数据结构,两个包也是有差别的, json字典value不支持其他对 ...

  2. 『Os』常用方法记录

    os.rename(name_old, name_new) 『Scrapy』爬取斗鱼主播头像 重命名函数os.rename比win下的重命名强多了,它可以对路径重命名达到修改文件位置的功效. os.p ...

  3. 『Scipy』常用方法记录

    优化器使用教程 J = lambda wb: self.get_cost_grad(wb, X, Y_one_hot) theta = self.wb_init(X,Y_one_hot) result ...

  4. 『Glob』常用方法记录

    glob.glob(file) 返回匹配的文件 glob.glob(./flower_photos/tulips/*.jpg) Out[1]:<br># ['./flower_photos ...

  5. 『Numpy』内存分析_高级切片和内存数据解析

    在计算机中,没有任何数据类型是固定的,完全取决于如何看待这片数据的内存区域. 在numpy.ndarray.view中,提供对内存区域不同的切割方式,来完成数据类型的转换,而无须要对数据进行额外的co ...

  6. 『Nltk』常用方法

    引言 在nltk的介绍文章中,前面几篇主要介绍了nltk自带的数据(书籍和语料),感觉系统学习意义不大,用到哪里看到那里就行(笑),所以这里会从一些常用功能开始,适当略过对于数据本体的介绍. 文本处理 ...

  7. 『Numpy』内存分析_numpy.dtype解析内存数据

    numpy.dtype用于自定义数据类型,实际是指导python程序存取内存数据时的解析方式. [注意],更改格式不能使用 array.dtype=int32 这样的硬性更改,会不改变内存直接该边解析 ...

  8. 『Numpy』内存分析_利用共享内存创建数组

    引.内存探究常用函数 id(),查询对象标识,通常返回的是对象的地址 sys.getsizeof(),返回的是 这个对象所占用的空间大小,对于数组来说,除了数组中每个值占用空间外,数组对象还会存储数组 ...

  9. 『Numpy』np.ravel()和np.flatten()

    What is the difference between flatten and ravel functions in numpy? 两者的功能是一致的,将多维数组降为一维,但是两者的区别是返回拷 ...

随机推荐

  1. eclipse工具maven项目打包文件不是最新修改的

    1.问题描述:maven项目,完成一些功能开发后,在进行打包更新服务器系统时,本地eclipse工具对文件打成jar包操作,更新到服务器上没有修改的效果,包括打包整个工程为一个war包,也是有同样问题 ...

  2. MAC安装最新datagrip之后无法非官方激活,而且启动过慢

    由于之前安装过,更新最新版本之后发现不能使用(http://xidea.online)激活??? 解决方法:使用CleanMyMac等相应软件删除之后,还要去相应的保存记录的路径(/Users/用户名 ...

  3. 百度云盘-真实地址 F12 控制台

    $.ajax({ type: "POST", url: "/api/sharedownload?sign="+yunData.SIGN+"&t ...

  4. jquery中的load方法加载页面无法缓存问题

    在A页面中调用JQuery中的load方法,加载另一个B页面,B页面中的样式文件和JS文件无法从浏览器缓存中获取,每次都是实时获取.这是因为B页面的HTML经load方法处理后,会为每个样式和JS文件 ...

  5. JavaScript 添加新元素

    JavaScript 添加新元素 版权声明:未经授权,严禁转载! 添加元素 创建元素 使用 JS 可以为一个已有的元素添加一个新的子元素. 第一步:创建空元素. - var elem = docume ...

  6. LightOJ - 1247 Matrix Game (Nim博弈)题解

    题意: 给一个矩阵,每一次一个玩家可以从任意一行中选任意数量的格子并从中拿石头(但最后总数要大于等于1),问你谁赢 思路: 一开始以为只能一行拿一个... 将每一行石子数相加就转化为经典的Nim博弈 ...

  7. rabbitmq direct、fanout、topic 三种Exchange java 代码比较

    Producer端 1.channel的创建 无论是才用什么样的Exchange,创建channel代码都是相同的,如下 ConnectionFactory factory = new Connect ...

  8. CodeForces 1029E div3

    题目链接 第一道场上自己做出来的E题...虽然是div3,而且是原题... 当时做完ABC,D题没有思路就去怼E了,然后发现貌似原题? 事实上就是原题... 给个原题链接... [HNOI2003]消 ...

  9. Java DateUtil,日期整理

    import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; imp ...

  10. Quartz.NET简介及入门指南

    Quartz.NET简介 Quartz.NET是一个功能完备的开源调度系统,从最小的应用到大规模的企业系统皆可适用. Quartz.NET是一个纯净的用C#语言编写的.NET类库,是对非常流行的JAV ...