Numpy使用3
来源:互联网 发布:淘宝首页资源位 编辑:程序博客网 时间:2024/05/01 08:24
上一篇博客介绍了numpy的几种初始化方式和numpy的数据类型(dtype)和shape的相关知识,这篇介绍numpy矩阵的索引与切片
矢量化
numpy数组有一个很好的特性就是支持vectorization,大小相同的数组做任何操作将在元素级别进行运算,这意味着我们可以像使用matlab那样对数据进行操作
In [46]: a = np.array([[1,2,4],[3,5,6]])In [47]: b = np.array([[2,3,7],[4,5,7]])In [48]: a+bOut[48]: array([[ 3, 5, 11], [ 7, 10, 13]])In [49]: a*bOut[49]: array([[ 2, 6, 28], [12, 25, 42]])In [50]: a * aOut[50]: array([[ 1, 4, 16], [ 9, 25, 36]])In [51]:
广播
numpy还有一个很好的特性就是支持broadcasting,数组与标量的运算也将映射到元素级
In [51]: 1 + aOut[51]: array([[2, 3, 5], [4, 6, 7]])In [52]: 2 * a + 3 *bOut[52]: array([[ 8, 13, 29], [18, 25, 33]])In [53]:
索引与切片
(1)一维数组
很简单,就和普通的数组几乎一样
In [55]: cOut[55]: array([1, 4, 5, 2, 6, 7])In [56]: c[3] # 下标访问Out[56]: 2In [57]: c[2:4] # 切片也是个数组Out[57]: array([5, 2])In [58]: c[2:4] = 8 # 连续赋值支持broadcastingIn [59]: cOut[59]: array([1, 4, 8, 8, 6, 7])In [60]:
(2)多维数组
多维数组可做的事情很多,索引下标是维度较低的数组,我们以三维数组为例说明
<1> 基本的索引
In [60]: d = np.ones((3,4,4), dtype=np.int16)In [61]: dOut[61]: array([[[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, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]], dtype=int16)In [62]: d += 4In [63]: d Out[63]: array([[[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]], [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]], [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]]], dtype=int16)In [64]: d.shapeOut[64]: (3, 4, 4) # d是一个三维数组(3*4*4)###########因为数组的维度为三,所以对其索引下标可以为标量或者是2维数组In [65]: d[0]Out[65]: array([[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]], dtype=int16)In [66]: d[0].shape # d[0]也是个数组,维度为2,大小为4*4Out[66]: (4, 4)In [67]: d[1][1] # d[1][1]也是个数组,维度为1,大小是4Out[67]: array([5, 5, 5, 5], dtype=int16)In [68]: d[1,1] # 也可以采用此种索引方法Out[68]: array([5, 5, 5, 5], dtype=int16)In [69]: d[1,1] = 4 # broadcasting式的赋值In [70]: dOut[70]: array([[[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]], [[5, 5, 5, 5], [4, 4, 4, 4], [5, 5, 5, 5], [5, 5, 5, 5]], [[5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5], [5, 5, 5, 5]]], dtype=int16)In [71]: d[1,1] = np.array([7,8,9,10]) # 可以相同大小的数组进行赋值In [72]: dOut[72]: array([[[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]], [[ 5, 5, 5, 5], [ 7, 8, 9, 10], [ 5, 5, 5, 5], [ 5, 5, 5, 5]], [[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]]], dtype=int16)In [73]:
<2> 切片索引
In [73]: dOut[73]: array([[[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]], [[ 5, 5, 5, 5], [ 7, 8, 9, 10], [ 5, 5, 5, 5], [ 5, 5, 5, 5]], [[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]]], dtype=int16)In [74]: d[:2] # 冒号前不写表示为0,冒号后不写表示到最后Out[74]: array([[[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]], [[ 5, 5, 5, 5], [ 7, 8, 9, 10], [ 5, 5, 5, 5], [ 5, 5, 5, 5]]], dtype=int16)In [75]: d[1:2, 1:2]Out[75]: array([[[ 7, 8, 9, 10]]], dtype=int16)In [76]: d[1:2, 1:2].shapeOut[76]: (1, 1, 4)In [77]: d[1:2, 1:2] = 12 # 同样的赋值也是broadcasting式的In [78]: dOut[78]: array([[[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]], [[ 5, 5, 5, 5], [12, 12, 12, 12], [ 5, 5, 5, 5], [ 5, 5, 5, 5]], [[ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5], [ 5, 5, 5, 5]]], dtype=int16)
<3> 布尔型索引
numpy数组还支持布尔型索引
In [80]: f = np.array([[1,3,5],[2,4,6]])In [81]: fOut[81]: array([[1, 3, 5], [2, 4, 6]])In [82]: f == 4 # 进行元素级别的比较,产生bool数组Out[82]: array([[False, False, False], [False, True, False]], dtype=bool)In [83]: f[f==4] # 选取f中元素数值等于4的Out[83]: array([4])##############如果有多个选取条件,可以使用&\|这样的表达In [84]: mask = (f == 4) | (f == 6) In [85]: f[mask]Out[85]: array([4, 6])
此篇就讲到这,下篇博客继续说
0 0
- Numpy使用3
- Numpy 使用教程 3
- 【CS231N】Numpy 使用入门 (3)
- numpy使用
- NumPy使用
- numpy 使用
- numpy使用
- Numpy(3)
- python numpy使用
- numpy where 的使用
- python numpy使用
- Numpy Python 使用感想
- python之Numpy使用
- NumPy使用(一)
- NumPy使用(二)
- python numpy使用
- Numpy:使用Matplotlib绘图
- Numpy使用1
- Asp.net B/S模式下使用Console.Write()
- 字符串和字典的相互转化
- 共享onload事件的使用(javascriptDOM编程艺术学习笔记)
- java内存模型
- php读取网络文件 curl, fsockopen ,file_get_contents 几个方法的效率对比
- Numpy使用3
- UISegment
- Android bootanimation 制作过程
- 基于BoF的图像分类完整步骤(以ScSPM为例)
- Android开发技巧——定制仿微信图片裁剪控件
- c++试题(1)
- 最短路径问题
- 实现button的监听,3种方式
- poj 3061 Subsequence