迭代计算

python之迭代器与生成器

試著忘記壹切 提交于 2019-12-03 03:23:09
python之迭代器与生成器 可迭代 假如现在有一个列表,有一个int类型的12345。我们循环输出。 list=[1,2,3,4,5] for i in list: print(i) for i in 12345: print(i) 结果: Traceback (most recent call last): File "C:/Pycham/生成器与迭代器/test1.py", line 6, in <module> for i in 12345: TypeError: 'int' object is not iterable 1 2 3 4 5 报错显示:1234不是可以被迭代的。 那python中哪些是 可迭代 的:字符串、列表、元组、字典、集合。 for循环工作机制:for循环在循环一个对象的时候,会调用这个对象的iter方法,得到迭代器,然后在调用这个迭代器的next方法,去获得这个迭代器中包涵的每个值。 现在可能我们不太明白,什么是iter方法,什么是迭代器,什么是next方法。    迭代器 但是如果只是将数据集内的数据“一个挨着一个的取出来,for循环就可以做到,为什么要使用迭代器呢?迭代器是什么? 迭代器能迭代的一定是可以迭代的数据类型。 如果我们要使用迭代器,一定要将可以被迭代的数据集转为迭代器,使用 __iter__() 。    #列表生成式 list=[1

Python中迭代器和生成器的区别详解

删除回忆录丶 提交于 2019-12-03 03:22:51
迭代器和生成器 https://taizilongxu.gitbooks.io/stackoverflow-about-python/content/1/README.html Stack Overflow上面关于这个问题非常好的一个回答的中文版。 先说结论: 迭代器一定是可迭代的,但是可迭代的不一定是迭代器。 生成器就是一种迭代器。迭代器有一个特点就是可以被 next() 函数调用并不断返回下一个值的对象, 并且 只能迭代它们一次。 原因很简单,因为它们不是全部存在内存里,它们只在要调用的时候在内存里生成。 定义generator(生成器)的另一种方法。如果一个函数定义中包含 yield (相当于其他函数的return) 关键字,那么这个函数就不再是一个普通函数,而是一个generator。 而可迭代对象指的是所有可以用在 for...in... 语句中的都是可迭代对象: Iterable, 比如lists,strings,files,dict...因为这些可迭代的对象你可以随意的读取所以非常方便易用, 但是你必须把它们的值放到内存里,当它们有很多值时就会消耗太多的内存。 但 list 、 dict 、 str 虽然是 Iterable ,却不是 Iterator 。把 list 、 dict 、 str 等 Iterable 变成 Iterator 可以使用 iter() 函数

python 迭代器与生成器

不问归期 提交于 2019-12-03 03:22:33
参考: 1. http://python.jobbole.com/81916/ 2. http://blog.csdn.net/bluebird_237/article/details/38894617 3. http://www.runoob.com/python3/python3-iterator-generator.html 迭代器 先了解几个概念: 可以直接作用于for循环的对象统称为可迭代对象(Iterable)。 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator)。 所有的Iterable均可以通过内置函数iter()来转变为Iterator。 对于迭代器而言,通过next()函数实现“迭代”这一概念,在使用for in语句的时候,程序就会自动调用即将被处理的对象的迭代器对象,然后使用它的next方法,当长度超过了迭代器长度时,就会报StopIteration的异常。 >>> a=[ 1 , 2 , 3 ] >>> for i in a: ... print(i) ... 1 2 3 >>> next (a) Traceback (most recent call last): File "<stdin>" , line 1 , in <module> TypeError: list object is not an iterator >>

python【5】迭代,生成,修饰

不问归期 提交于 2019-12-03 01:49:40
迭代器 迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退。另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件 特点: 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容 不能随机访问集合中的某个值 ,只能从头到尾依次访问 访问到一半时不能往回退 便于循环比较大的数据集合,节省内存 from collections import Iterator # isinstance() 判断是否是 迭代器# 可以被next()函数不断返还下一个值的被称为迭代器# iter() 可以将 list dict str 编程迭代器 生成器generator 定义:一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如果函数中包含yield语法,那这个函数就会变成生成器 #!/usr/bin/env python # -*- coding: utf-8 -*- # By Garrett a = [i*2 for i in range(10)] print(a) #

Capsule Network

匿名 (未验证) 提交于 2019-12-03 00:40:02
Capsule Network最大的特色在于vector in vector out & 动态路由算法。 vector in vector out 所谓vector in vector out指的是将原先使用 标量表示 的神经元变为使用 向量表示 的神经元。这也即是所谓的“Capsule”,“vector in vector out”或者“胶囊”所要表达的意思。按照Hinton的理解,每一个胶囊表示一个属性,而胶囊的向量则表示该特征的某些“含义”。比如,之前我们使用标量表示有没有羽毛,现在我们使用向量来表示,不仅表示有没有,还表示了有什么颜色,什么材料的特征。也就是说将神经元从标量改为向量后,在特征提取时,对单个特征的表达更为丰富了。 这有些像NLP中的词向量,之前使用的是one hot表示一个词,只能表示有没有该词而已,引入了word2vec不但表示有没有,而且能够表示该词的“意思”,表意更加丰富了。 部分人叫“Capsule Network胶囊网络”为“张量网络” 层层抽象,层层分类 上图展示了特征 \(u_1\) 的连接,目前从上一层传来的特征 \(u_1\) 假设表示羽毛,下一层抽取得到的 \(v_1,v_2,v_3,v_4\) 分别表示猫、狗、兔、鸟4个种类。可以很容易想到softmax: \[ (p_{1|1},p_{2|1},p_{3|1},p_{4|1})=

Stream01 定义、迭代、操作、惰性求值

匿名 (未验证) 提交于 2019-12-03 00:34:01
1 Stream   Stream 是 Java 8 提供的一系列对可迭代元素处理的优化方案,使用 Stream 可以大大减少代码量,提高代码的可读性并且使代码更易并行。 2 迭代   2.1 需求     随机创建int类型的数组,计算数组中各个元素的总和   2.2 思路     2.2.1 外部迭代       通过for循环迭代数组     2.2.2 内部迭代       先将数组转化成流 -> 在通过流的相关操作来实现     2.2.3 外部迭代和内部迭代       外部迭代式串行的,如果要实现并行需要自己编写代码实现;内部迭代实现并行操作只需要调用一个parallel()操作即可以啦   2.3 代码实现 package demo01_iteration; import org.junit.Before; import org.junit.Test; import java.util.Arrays; import java.util.Random; import java.util.stream.IntStream; /** * @author 王杨帅 * @create 2018-06-24 22:48 * @desc 外部迭代和内部迭代 * */ public class Case01 { private int [] nums; private int

理解梯度下降法

匿名 (未验证) 提交于 2019-12-03 00:30:01
导言 最优化问题在机器学习中有非常重要的地位,很多机器学习算法最后都归结为求解最优化问题。在各种最优化算法中,梯度下降法是最简单、最常见的一种,在深度学习的训练中被广为使用。在本文中, SIGAI 将为大家系统的讲述梯度下降法的原理和实现细节问题。 最优化问题是求解函数极值的问题,包括极大值和极小值。相信所有的读者对这个问题都不陌生,在初中时我们就学会了求解二次函数的极值(抛物线的顶点),高中时学习了幂函数,指数函数,对数函数,三角函数,反三角函数等各种类型的函数,求函数极值的题更是频频出现。这些方法都采用了各种各样的技巧,没有一个统一的方案。 真正的飞跃发生在大学时,微积分为我们求函数的极值提供了一个统一的思路:找函数的导数等于0的点,因为在极值点处,导数必定为0。这样,只要函数的可导的,我们就可以用这个万能的方法解决问题,幸运的是,在实际应用中我们遇到的函数基本上都是可导的。 在机器学习之类的实际应用中,我们一般将最优化问题统一表述为求解函数的极小值问题,即: 其中x称为优化变量,f称为目标函数。极大值问题可以转换成极小值问题来求解,只需要将目标函数加上负号即可: 有些时候会对优化变量x有约束,包括等式约束和不等式约束,它们定义了优化变量的可行域,即满足约束条件的点构成的集合。在这里我们先不考虑带约束条件的问题。 一个优化问题的全局极小值是指对于可行域里所有的x,有:

牛顿迭代法

匿名 (未验证) 提交于 2019-12-03 00:25:02
目前接触到的牛顿迭代法主要应用于两个方面:(1)方程求根问题(2)最优化问题。 1、求解方程。 并不是所有的方程都有求根公式,或者求根公式很复杂,导致求解困难。利用牛顿法,可以迭代求解。 原理是利用泰勒公式,在x0处展开,且展开到一阶,即f(x) = f(x0)+(x-x0)f'(x0) 求解方程f(x)=0,即f(x0)+(x-x0)*f'(x0)=0,求解 x = x1=x0-f(x0)/f'(x0) ,因为这是利用泰勒公式的一阶展开,f(x) = f(x0)+(x-x0)f'(x0)处并不是完全相等,而是近似相等,这里求得的x1并不能让f(x)=0,只能说f(x1)的值比f(x0)更接近f(x)=0,于是乎,迭代求解的想法就很自然了,可以进而推出x(n+1)=x(n)-f(x(n))/f'(x(n)),通过迭代,这个式子必然在f(x*)=0的时候收敛。整个过程如下图: 2、牛顿法用于最优化 在最优化的问题中,线性最优化至少可以使用单纯行法求解,但对于非线性优化问题,牛顿法提供了一种求解的办法。假设任务是优化一个目标函数f,求函数f的极大极小问题,可以转化为求解函数f的导数f'=0的问题,这样求可以把优化问题看成方程求解问题(f'=0)。剩下的问题就和第一部分提到的牛顿法求解很相似了。 这次为了求解f'=0的根,把f(x)的泰勒展开,展开到2阶形式: 这个式子是成立的,当且仅当

迭代最近点(Iterative Closest Point, ICP)算法及matlab实现

匿名 (未验证) 提交于 2019-12-03 00:22:01
通常,使用RGB-D相机或是其他方法获取到物体的三维点云后,由于采集设备不同、拍摄视角不同等等因素的影响,即使是同一个物体所得到的点云也会有较大的差异,主要是旋转或者平移的变化。对于一组图像数据集中的两幅图像,需要通过寻找一种空间变换把一幅图像映射到另一幅图像,使得两图中对应于空间同一位置的点一一对应起来,从而达到信息融合的目的。所以,就需要对点云进行配准。 迭代最近点算法(ICP)是一种点云匹配算法。其思想是:通过旋转、平移使得两个点集之间的距离最小。ICP算法由Besl等人于1992年提出,文献可以参考: A Method for Registration of 3D Shapes ,另外还可以参考: Least-Squares Fitting of Two 3-D Point Sets 。前者使用的是四元数方法来求解旋转矩阵,而后者则是通过对协方差矩阵求解SVD来得到最终的旋转矩阵。流程大体上一致,后面就主要列出前者的流程。 ICP 我们可以使用四元数表示旋转关系: q R → = [ q 0 q 1 q 2 q 3 ] T q R → = [ q 0 q 1 q 2 q 3 ] T ,满足条件: q 0 ≥ 0 q 0 ≥ 0 、 q 2 0 + q 2 1 + q 2 2 + q 2 3 = 1 q 0 2 + q 1 2 + q 2 2 + q 3 2 = 1 。

HashMap的6个知识点

匿名 (未验证) 提交于 2019-12-03 00:21:02
HashMap的6个知识点: 概述: HashMap 是key-value数据结构 ,是基于哈希表的 Map 接口的 非同步 实现。此实现提供所有可选的映射操作,并 允许key和value为null 。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 的数据结构: HashMap 实际上是一个“链表散列”的数据结构,即 数组和链表 的结合体。 的读取实现: HashMap存储数据使用put()方法,该方法首先会将调用String的 hashCode() 方法得到其 hashCode 值――每个 Java 对象都有 hashCode() 方法,都可通过该方法获得它的 hashCode 值。得到这个对象的 hashCode 值之后,系统会根据该 hashCode 值来决定该元素的存储位置。如果该位置已经存在key值,则发生哈希冲突。 How:HashMap怎样解决哈希冲突? 链地址法:就是在冲突的位置上新建一个链表,然后将冲突的元素插入到链表尾端。 当HashMap调用get()方法获取value时,首先会根据key的hashcode()值到相应的Entry数组位置上,再如果只有一个key直接返回value,如果该数组位置存在链表维护多个key,则再使用equals(key)来获取相应的value值。 HashMap的4种遍历方式 的 resize ( rehash ): 当