Numpy使用3

上一篇博客介绍了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+b
Out[48]: 
array([[ 3,  5, 11],
       [ 7, 10, 13]])

In [49]: a*b
Out[49]: 
array([[ 2,  6, 28],
       [12, 25, 42]])

In [50]: a * a
Out[50]: 
array([[ 1,  4, 16],
       [ 9, 25, 36]])

In [51]: 

广播

numpy还有一个很好的特性就是支持broadcasting,数组与标量的运算也将映射到元素级

In [51]: 1 + a
Out[51]: 
array([[2, 3, 5],
       [4, 6, 7]])

In [52]: 2 * a  + 3 *b
Out[52]: 
array([[ 8, 13, 29],
       [18, 25, 33]])

In [53]: 

索引与切片

(1)一维数组

很简单,就和普通的数组几乎一样

In [55]: c
Out[55]: array([1, 4, 5, 2, 6, 7])

In [56]: c[3]  # 下标访问
Out[56]: 2

In [57]: c[2:4]  # 切片也是个数组
Out[57]: array([5, 2])

In [58]: c[2:4] = 8  # 连续赋值支持broadcasting

In [59]: c
Out[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]: d
Out[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 += 4

In [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.shape
Out[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*4
Out[66]: (4, 4)

In [67]: d[1][1]  # d[1][1]也是个数组,维度为1,大小是4
Out[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]: d
Out[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]: d
Out[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]: d
Out[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].shape
Out[76]: (1, 1, 4)

In [77]: d[1:2, 1:2] = 12  # 同样的赋值也是broadcasting式的

In [78]: d
Out[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]: f
Out[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 条评论
登录 后参与评论

相关文章

来自专栏机器学习和数学

[编程经验] Python 中列表list介绍

列表是Python中非常重要的一种数据结构,使用频率非常高,本文主要介绍对于学习python的新手来说,需要掌握的一些基础知识。 1. 创建列表 ? 列表用中括...

2665
来自专栏北京马哥教育

正则表达式基本语法

\将下一字符标记为特殊字符、文本、反向引用或八进制转义符。例如,“n”匹配字符“n”。“\n”匹配换行符。序列“\\”匹配“\”,“\(”匹配“(”。^匹...

3457
来自专栏程序员互动联盟

【编程基础】Java 如何完成数据类型转换

在写程序的时候经常遇到数据的运算,在数据运算中又经常遇到不同类型的数据之间进行转换,那么数据类型之间的转换规则是什么样的呢? Java数据类型转换分为两种: ...

2564
来自专栏angularejs学习篇

angularjs学习第八天笔记(指令作用域研究)

angularjs其作用域通过scope来实现,其取值有三种情况:true、false、{}

681
来自专栏C语言及其他语言

C语言的数据类型

变量与常量数据 在程序的世界中,可以让计算机按照指令做很多事情,如进行数值计算、图像显示、语音对话、视频播放、天文计算、发送邮件、游戏绘图以及任何我们可以想...

3195
来自专栏向治洪

模板方法模式

概述 概念:定义一个操作中算法的框架,而将一些步骤延迟到子类中,使得子类可以不改变算法的结构即可重定义该算法中的某些特定步骤。模板方法模式属于行为类模式。 模板...

1737
来自专栏练小习的专栏

js运算符优先级笔记

运算符的优先级决定了表达式中运算执行的先后顺序,优先级高的运算符最先被执行。 下面是一个简单的例子: 3 + 4 * 5 // 计算结果为23 乘法运算符...

1848
来自专栏程序员互动联盟

【编程基础】C++ Primer快速入门五:实用的模板库

除上篇博客介绍的基本数据类型外,C++ 还定义了一个内容丰富的抽象数据类 型标准库。包括 string 和 vector,它们分别定义了字符串和矢量(集合)。s...

2715
来自专栏debugeeker的专栏

《coredump问题原理探究》Linux x86版5.8节C风格数据结构内存布局之结构体数组结构体coredump

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuzhina/article/detai...

491
来自专栏代码世界

装饰器进阶

装饰带参数函数 def foo(func): # 接收的参数是一个函数名 def bar(x, y): # 这里需要定义和被装饰函数相同的参数 ...

33310

扫码关注云+社区