股票Mic上证指数成份股股何时

&figure&&img src=&https://pic1.zhimg.com/v2-f2fc231a144fa9f04c70efd_b.jpg& data-rawwidth=&984& data-rawheight=&513& class=&origin_image zh-lightbox-thumb& width=&984& data-original=&https://pic1.zhimg.com/v2-f2fc231a144fa9f04c70efd_r.jpg&&&/figure&&p&【导读】主题荟萃知识是专知的核心功能之一,为用户提供AI领域系统性的知识学习服务。主题荟萃为用户提供全网关于该主题的精华(Awesome)知识资料收录整理,使得AI从业者便捷学习和解决工作问题!在&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU2OTA0NzE2NA%3D%3D%26mid%3D%26idx%3D1%26sn%3Db016a1ba640bec9fchksm%3Dfc85e045cbfcde561dbcf64a218bc32ad268df0f3ad779dscene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&专知人工智能主题知识树&/a&基础上,主题荟萃由专业人工编辑和算法工具辅助协作完成,并保持动态更新!另外欢迎对此创作主题荟萃感兴趣的同学,请加入我们&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU2OTA0NzE2NA%3D%3D%26mid%3D%26idx%3D5%26sn%3Df610d768df0fbbbcca5700ecdchksm%3Dfc85e4b1cbf26da7bcf61c62e74dba2c6c376b4aea80da855fa5f8d0ca440bccc%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&专知AI创作者计划,共创共赢&/a&! 今天专知为大家呈送&b&第五篇专知主题荟萃聊天机器人Chatbot知识资料全集(入门/进阶/论文/软件/数据/专家等)(附pdf下载)&/b&,请大家查看!专知访问www.zhuanzhi.ai, 或关注微信公众号后台回复& &b&专知&/b&&进入专知,搜索主题“深度学习”查看。欢迎转发分享!此外,&b&我们也提供该文pdf下载链接,请文章末尾查看&/b&!&/p&&p&&br&&/p&&p&了解专知,&b&&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s%3F__biz%3DMzU2OTA0NzE2NA%3D%3D%26mid%3D%26idx%3D1%26sn%3Df02bacf33c4da%26chksm%3Dfc85e029cbfb98cf97d6d97aa2f32eeece18b0cad506e6bdb06f4a67%26scene%3D21%23wechat_redirect& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&专知,一个新的认知方式!&/a&&/b&&/p&&ul&&li&&b&聊天机器人 (Chatbot) 专知荟萃&/b&&/li&&ul&&li&入门学习&/li&&li&进阶论文&/li&&li&综述&/li&&li&专门会议&/li&&li&Tutorial&/li&&li&软件&/li&&ul&&li&Chatbot&/li&&li&Chinese_Chatbot&/li&&/ul&&li&数据集&/li&&li&领域专家&/li&&/ul&&/ul&&p&&b&看详情,请点击到专知网址-&/b&&a href=&http://link.zhihu.com/?target=http%3A//www.zhuanzhi.ai/topic/0840/awesome& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&聊天机器人 (Chatbot) 专知荟萃&/a&&b&~具体查看&/b&&/p&&p&&b&或者可以点击专知微信公众号文章查看:&/b&&/p&&p&&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s/GLrJ9HImHztVcN8w1Wk2ng& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【专知荟萃05】聊天机器人Chatbot知识资料全集(入门/进阶/论文/软件/数据/专家等)(附pdf下载)&/a&&/p&&p&&b&特注&/b&&/p&&p&&b&因篇幅限制,不能全部显示,完整版,请登录&/b&&a href=&http://link.zhihu.com/?target=http%3A//www.zhuanzhi.ai/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&专知网站&/a&(&b&www.zhuanzhi.ai)或者点击阅读原文,顶端搜索“知识图谱” 主题,查看获得自然语言处理专知荟萃全集知识等资料!如下图所示~&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-59da7feee5ded1d1f2aa0fa_b.jpg& data-caption=&& data-rawwidth=&1300& data-rawheight=&613& class=&origin_image zh-lightbox-thumb& width=&1300& data-original=&https://pic3.zhimg.com/v2-59da7feee5ded1d1f2aa0fa_r.jpg&&&/figure&&p&&b&此外,请关注专知公众号,(点击&/b&&a href=&http://link.zhihu.com/?target=http%3A//mp.weixin.qq.com/s/GLrJ9HImHztVcN8w1Wk2ng& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【专知荟萃05】聊天机器人Chatbot知识资料全集(入门/进阶/论文/软件/数据/专家等)(附pdf下载)&/a&&b&)&/b&&/p&&ul&&li&&b&后台回复“KG” 或者“知识图谱”就可以获取专知知识图谱荟萃知识资料pdf下载链接~~&/b&&/li&&/ul&&p&&b&欢迎使用&/b&&a href=&http://link.zhihu.com/?target=http%3A//www.zhuanzhi.ai/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&专知&/a&&/p&&p&专知,一个新的认知方式!目前聚焦在人工智能领域为AI从业者提供专业可信的知识分发服务, 包括主题定制、主题链路、搜索发现等服务,帮你又好又快找到所需知识。&/p&
【导读】主题荟萃知识是专知的核心功能之一,为用户提供AI领域系统性的知识学习服务。主题荟萃为用户提供全网关于该主题的精华(Awesome)知识资料收录整理,使得AI从业者便捷学习和解决工作问题!在基础上,主题荟萃由专业人工编辑…
&figure&&img src=&https://pic4.zhimg.com/v2-02fe0a22ddbc97_b.jpg& data-rawwidth=&2332& data-rawheight=&610& class=&origin_image zh-lightbox-thumb& width=&2332& data-original=&https://pic4.zhimg.com/v2-02fe0a22ddbc97_r.jpg&&&/figure&&p&今年年中的时候,Barra搞了个&a href=&http://link.zhihu.com/?target=https%3A//www.msci.com/factor-lab& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Factor Lab&/a&,引起了市场很大的反响,对传统资产管理公司的冲击尤其大。这个FactorLab是什么呢?简而言之,就是MSCI搞出了八十多个所谓的“风格因子”,涵盖范围之广,从传统的财务因子,到期权、新闻数据、公司结构、技术指标,几乎囊括了市场上绝大多数的“系统投资”策略。&/p&&p&以一类所谓的“Sentiment”因子为例,根据Barra方面的文档,这个因子用了多个原始文本实时数据来源,经过“长期、严谨”的研究,构造出了一个信号,这个信号在过去的十余年里回报非凡。这个因子,在十余年前,是很多对冲基金主要、甚至唯一的竞争优势——那时候,这不叫因子,叫Sentiment Alpha——获得实时的文本数据,训练大量的数据和模型,雇佣上百个商学院毕业的Analyst对公司公告和政府新闻进行人工标注、训练,经过数十个工程师数年的开发,才能做出一个Sharpe 2+的、基于情绪文本数据的策略。十多年过去了,随着越来越多的交易者和供应商对相同的数据源进行训练,这个策略越来越无效,到2018年,竟然被当成一个明码标价的因子,只要给MSCI一小笔费用,点点鼠标,就能获得这个红极一时的Alpha。每一个因子,曾经都是叱咤风云的Alpha,用的人多了,就成了因子,成了风险模型的一部分,成了需要被控制的、需要与之垂直的一组向量。&/p&&p&这个现象,看起来简单,其实蕴涵着经济学和金融市场的深层结构。&/p&&p&假设天才交易员A,经历了十数年的股票、期权交易,终于总结出了基于期权市场走势预测股票的绝妙策略;或者,资深投资人B,经历了十数年私募股权的估值研究,终于总结出了基于供应链关系和财务数据预测股票的绝妙策略;假设,这个绝妙的策略只有A/B知道,并且十分有效,这就成了他们的Alpha,给他们带来了短期内惊人的回报。所谓Alpha,根据定义,就是不能被“系统性风险”所解释的回报。为什么A和B的策略属于Alpha?因为除了他们,没有人知道相似的策略;他们的回报和市场上其他的回报不相关——暨,别人无法用众所周知的风险因子的&u&线性&/u&组合复制A和B的回报。市场涨,A和B赚的比别人多,市场跌,A和B赔的比别人少。甚至,当传统的因子,比如价值(Value)、动量(Momentum)纷纷下跌时,A和B的策略依然表现的比别人好,这就是Alpha的体现。&/p&&p&我们再假设,过了几年,也许是因为A和B的手下跳槽,也许因为别人也碰巧研究出了相同的策略,也许监管A和B策略的SEC工作人员打了小抄并转身入市——市场上,渐渐地,更多的人开始做与A/B相似的策略。这个时候,A和B就会发现,自己的策略开始不赚钱了,至少没以前那么能赚了。这个道理乍一听很浅显,可是究竟为什么,拥挤(Crowding)会导致策略失效?&/p&&p&当Alpha还是Alpha的时候,我们可以认为,其获利的本质是找到了市场的某种无效性。这种无效性是不完美的市场自发组织的结构,一个Alpha,就是系统性地利用了这个无效性,从而获利。这一获利行为本身,会矫正无效性,或者可以认为,Alpha带来的超额收益,是对纠正市场失常奖赏。(逆反命题,做市就不是Alpha,因为做市的回报是对提供流动性的奖赏,而不是纠正市场失常/无效)。&/p&&p&那么,当这个Alpha被越来越多的人用来交易,其失效,本质上是因为,随着越来越多的人齐心协力去纠正市场,市场已经被纠正的差不多了。借用经济学的术语,只要Alpha还有超额收益,就会有更多的人参与到这个生意里,直到这个Alpha没有超额收益,则这个“Alpha”的市场达到了均衡——每一个使用它的交易者获得的经济利润为零。达到均衡时,人们使用这个Alpha所得的回报,和其付出的经济“成本”相当。&/p&&p&这个模型,要求Alpha 的边际收益随竞争者数量递减,边际成本随着竞争者数量递增。边际收益为何会递减道理很简单,奥妙主要在于边际成本递增(这不是显然的)。&/p&&p&如果我们用经济学的术语去解释Alpha在均衡时实效,我们还需要定义在均衡时,仍在使用Alpha的“成本”是什么。比如一个绝妙的期权信号,或是一个基于文本数据的策略,在均衡状态下,主要的成本其实是拥挤(Crowding)成本——因为有足够多的参与者都在交易这个Alpha所带来的风险,而金融市场的经济成本就是风险(会计成本是人力成本和数据成本)。这个风险,本质上是当市场变动时,高度相关的仓位和预测带来的连锁反应,暨所谓的“&u&一个个同行被接二连三强行平仓,他们卖跌我买的,买涨我卖的&/u&”,所带来的风险。那么,自然交易同一个策略的人越多,市场上相关的仓位就越多,就越拥挤,自然拥挤风险就越大。&/p&&p&当一个Alpha的边际收益跌落到其边际经济成本时,经济利润为零,这个Alpha的“市场”达到均衡。这时,会计利润可能还是正的,但这部分正的会计利润,在金融里被认为是承担风险所带来的补偿。这个状态下,市场参与者的数量是稳定的,这也解释了为何风格相似的对冲基金的就那么几家。&/p&&p&当一个Alpha从只有少数人知道的秘密,变成人人都用的策略时,这个Alpha就不再能带来超额收益,就成了风险因子。然而,很多人经常搞不清楚,以为风险因子没有价值。风险因子并不等于无效因子,风险因子仍然能带来正回报,本质上因为,经济利润为零的生意,会计利润依然为正。(我在偷换概念,见谅)。一旦大家都不再交易这个因子,市场又回重新回到失常的状态;然而现实是,一旦这个因子被Barra/MSCI纳入风险模型,就会成为市场标准化的一部分。随着越来越多的Alpha沦为众所周知的因子,市场变得愈发有效。短短二三十年,从FF的三因子四因子模型,到如今Barra搞出这个Factor Lab,越来越难以在市场上获得超额回报,市场的系统性失常越来越少,开发新Alpha的边际成本也越来越高。90年代,十几个分析师,按计算器,长线投价值(Value),短线搞动量(Momentum)就能成为传奇;世纪初,搞到文本、高频、衍生品数据,做几个残差回归(Residual Reversal)、情绪指标(Sentiment Indicator)、评级修正(Analyst Rec Modification)就能年化30%;而如今,各大对冲基金纷纷开始求助于神经网络炼丹玄学,依然落得回报个位数,甚至亏损的下场。&/p&&p&既然Alpha这么难做,还要不要追求Alpha?我觉得这事情随缘,一切随市场,有钱赚就做Alpha,没钱赚就卖Factor;每个金融从业人员,大概都是坚定的市场主义者和投机分子吧哈哈。&/p&&p&(题图来自MSCI Factor Lab的那个页面,截图截的)&/p&
今年年中的时候,Barra搞了个,引起了市场很大的反响,对传统资产管理公司的冲击尤其大。这个FactorLab是什么呢?简而言之,就是MSCI搞出了八十多个所谓的“风格因子”,涵盖范围之广,从传统的财务因子,到期权、新闻数据、公司结构、技术指标,…
&figure&&img src=&https://pic2.zhimg.com/v2-53a59fcf0e4fbd3deeced82e986c4c03_b.jpg& data-rawwidth=&347& data-rawheight=&220& class=&content_image& width=&347&&&/figure&&p&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-a6e41d7469aaebe5669ece_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&347& data-rawheight=&220& class=&content_image& width=&347&&&/figure&&p&&br&标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指 针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计算时间。&br&此外Python还提供了一个array模块,array对象和列表不同,它直接保存数值,和C语言的一维数组比较类似。但是由于它不支持多维,也没有各种运算函数,因此也不适合做数值运算。&br&NumPy的诞生弥补了这些不足,NumPy提供了两种基本的对象:ndarray(N-dimensional array object)和 ufunc(universal function object)。ndarray(下文统一称之为数组)是存储单一数据类型的多维数组,而ufunc则是能够对数组进行处理的函数。&b&喜欢的话关注收藏评论转发比心么么哒!Python学习交流企-鹅-群-719-139-688内有大量的项目开发和新手教学视频PDF书籍的千人大群等着你来加入&/b&&br&&b&2.1 ndarray对象&/b&&br&函数库的导入&br&本书的示例程序假设用以下推荐的方式导入NumPy函数库:&br&import numpy as np&br&&b&2.1.1 创建&/b&&br&首先需要创建数组才能对其进行其它操作。&br&我们可以通过给array函数传递Python的序列对象创建数组,如果传递的是多层嵌套的序列,将创建多维数组(下例中的变量c):&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e2281985bed6e4b27a42e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&419& data-rawheight=&391& class=&content_image& width=&419&&&/figure&&p&&br&数组a的shape只有一个元素,因此它是一维数组。而数组c的shape有两个元素,因此它是二维数组,其中第0轴的长度为3,第1轴的长度为 4。还可以通过修改数组的shape属性,在保持数组元素个数不变的情况下,改变数组每个轴的长度。下面的例子将数组c的shape改为(4,3),注意 从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-8a0b3ad587b6efebb304c3_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&192& data-rawheight=&140& class=&content_image& width=&192&&&/figure&&p&&br&当某个轴的元素为-1时,将根据数组元素的个数自动计算此轴的长度,因此下面的程序将数组c的shape改为了(2,6):&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-02bf8baad26fae32d9e5c14c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&268& data-rawheight=&103& class=&content_image& width=&268&&&/figure&&p&&br&使用数组的reshape方法,可以创建一个改变了尺寸的新数组,原数组的shape保持不变:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-f750e1d85e1a77aff2ef_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&263& data-rawheight=&144& class=&content_image& width=&263&&&/figure&&p&&br&数组a和d其实共享数据存储内存区域,因此修改其中任意一个数组的元素都会同时修改另外一个数组的内容:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-258f3ca37a4ef440692de_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&309& data-rawheight=&106& class=&content_image& width=&309&&&/figure&&p&&br&数组的元素类型可以通过dtype属性获得。上面例子中的参数序列的元素都是整数,因此所创建的数组的元素类型也是整数,并且是32bit的长整型。可以通过dtype参数在创建时指定元素类型:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-b0daafe38c144eb57710db_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&504& data-rawheight=&191& class=&origin_image zh-lightbox-thumb& width=&504& data-original=&https://pic1.zhimg.com/v2-b0daafe38c144eb57710db_r.jpg&&&/figure&&p&&br&上面的例子都是先创建一个Python序列,然后通过array函数将其转换为数组,这样做显然效率不高。因此NumPy提供了很多专门用来创建数组的函数。下面的每个函数都有一些关键字参数,具体用法请查看函数说明。&br&&/p&&ul&&li&arange函数类似于python的range函数,通过指定开始值、终值和步长来创建一维数组,注意数组不包括终值:&/li&&/ul&&figure&&img src=&https://pic3.zhimg.com/v2-f697ebfedda653b8411126_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&451& data-rawheight=&50& class=&origin_image zh-lightbox-thumb& width=&451& data-original=&https://pic3.zhimg.com/v2-f697ebfedda653b8411126_r.jpg&&&/figure&&p&&br&linspace函数通过指定开始值、终值和元素个数来创建一维数组,可以通过endpoint关键字指定是否包括终值,缺省设置是包括终值:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-22dcd4d8e9c3b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&455& data-rawheight=&91& class=&origin_image zh-lightbox-thumb& width=&455& data-original=&https://pic3.zhimg.com/v2-22dcd4d8e9c3b_r.jpg&&&/figure&&p&&br&logspace函数和linspace类似,不过它创建等比数列,下面的例子产生1(10^0)到100(10^2)、有20个元素的等比数列:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-3ba067bfd86d290fac16fe_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&427& data-rawheight=&142& class=&origin_image zh-lightbox-thumb& width=&427& data-original=&https://pic4.zhimg.com/v2-3ba067bfd86d290fac16fe_r.jpg&&&/figure&&p&&br&此外,使用frombuffer, fromstring, fromfile等函数可以从字节序列创建数组,下面以fromstring为例:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-6dabc029b1ff3f72bb57_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&161& data-rawheight=&45& class=&content_image& width=&161&&&/figure&&p&&br&Python的字符串实际上是字节序列,每个字符占一个字节,因此如果从字符串s创建一个8bit的整数数组的话,所得到的数组正好就是字符串中每个字符的ASCII编码:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-aa6fd732e4e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&389& data-rawheight=&56& class=&content_image& width=&389&&&/figure&&p&&br&如果从字符串s创建16bit的整数数组,那么两个相邻的字节就表示一个整数,把字节98和字节97当作一个16位的整数,它的值就是98*256+97 = 25185。可以看出内存中是以little endian(低位字节在前)方式保存数据的。&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d0babb974b814090cfa31f1_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&409& data-rawheight=&94& class=&content_image& width=&409&&&/figure&&p&&br&如果把整个字符串转换为一个64位的双精度浮点数数组,那么它的值是:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-7aae59ef89be18c6648ea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&251& data-rawheight=&43& class=&content_image& width=&251&&&/figure&&p&&br&显然这个例子没有什么意义,但是可以想象如果我们用C语言的二进制方式写了一组double类型的数值到某个文件中,那们可以从此文件读取相应的数据,并通过fromstring函数将其转换为float64类型的数组。&br&我们可以写一个Python的函数,它将数组下标转换为数组中对应的值,然后使用此函数创建数组:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-cbace5e36e426fd2565eec_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&397& data-rawheight=&131& class=&content_image& width=&397&&&/figure&&p&&br&fromfunction函数的第一个参数为计算每个数组元素的函数,第二个参数为数组的大小(shape),因为它支持多维数组,所以第二个参数必须是一个序列,本例中用(10,)创建一个10元素的一维数组。&br&下面的例子创建一个二维数组表示九九乘法表,输出的数组a中的每个元素a[i, j]都等于func2(i, j):&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-f01b78ddedee_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&404& data-rawheight=&319& class=&content_image& width=&404&&&/figure&&p&&br&&b&2.1.2 存取元素&/b&&br&数组元素的存取方法和Python的标准方法相同:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-5f63ebaafcf2c398efbd9e4e8aff86ed_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&454& data-rawheight=&418& class=&origin_image zh-lightbox-thumb& width=&454& data-original=&https://pic2.zhimg.com/v2-5f63ebaafcf2c398efbd9e4e8aff86ed_r.jpg&&&/figure&&p&&br&和Python的列表序列不同,通过下标范围获取的新的数组是原始数组的一个视图。它与原始数组共享同一块数据空间:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-b5ba61a5aa439c6fad6a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&451& data-rawheight=&184& class=&origin_image zh-lightbox-thumb& width=&451& data-original=&https://pic2.zhimg.com/v2-b5ba61a5aa439c6fad6a_r.jpg&&&/figure&&p&&br&除了使用下标范围存取元素之外,NumPy还提供了两种存取元素的高级方法。&br&&b&使用整数序列&/b&&br&当使用整数序列对数组元素进行存取时,将使用整数序列中的每个元素作为下标,整数序列可以是列表或者数组。使用整数序列作为下标获得的数组不和原始数组共享数据空间。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-98aab2c817ab00b0b280c59c0fe678c6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&472& data-rawheight=&318& class=&origin_image zh-lightbox-thumb& width=&472& data-original=&https://pic4.zhimg.com/v2-98aab2c817ab00b0b280c59c0fe678c6_r.jpg&&&/figure&&p&&br&&b&使用布尔数组&/b&&br&当使用布尔数组b作为下标存取数组x中的元素时,将收集数组x中所有在数组b中对应下标为True的元素。使用布尔数组作为下标获得的数组不和原始数组共享数据空间,注意这种方式只对应于布尔数组,不能使用布尔列表。&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-458cc0ba146fcb52aba7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&497& data-rawheight=&375& class=&origin_image zh-lightbox-thumb& width=&497& data-original=&https://pic1.zhimg.com/v2-458cc0ba146fcb52aba7_r.jpg&&&/figure&&p&&br&布尔数组一般不是手工产生,而是使用布尔运算的ufunc函数产生,关于ufunc函数请参照 ufunc运算 一节。&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-fcec5baf08c8ba555f9ff248e4e97917_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&564& data-rawheight=&249& class=&origin_image zh-lightbox-thumb& width=&564& data-original=&https://pic1.zhimg.com/v2-fcec5baf08c8ba555f9ff248e4e97917_r.jpg&&&/figure&&p&&br&&b&2.1.3 多维数组&/b&&br&多维数组的存取和一维数组类似,因为多维数组有多个轴,因此它的下标需要用多个值来表示,NumPy采用组元(tuple)作为数组的下标。如图2.1所示,a为一个6x6的数组,图中用颜色区分了各个下标以及其对应的选择区域。&br&组元不需要圆括号&br&虽然我们经常在Python中用圆括号将组元括起来,但是其实组元的语法定义只需要用逗号隔开即可,例如 x,y=y,x 就是用组元交换变量值的一个例子。&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-2d74aacd0b4e0b93f93c_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&557& data-rawheight=&314& class=&origin_image zh-lightbox-thumb& width=&557& data-original=&https://pic3.zhimg.com/v2-2d74aacd0b4e0b93f93c_r.jpg&&&/figure&&p&&br&&b&如何创建这个数组&/b&&br&你也许会对如何创建a这样的数组感到好奇,数组a实际上是一个加法表,纵轴的值为0, 10, 20, 30, 40, 50;横轴的值为0, 1, 2, 3, 4, 5。纵轴的每个元素都和横轴的每个元素求和,就得到图中所示的数组a。你可以用下面的语句创建它,至于其原理我们将在后面的章节进行讨论:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-dd7ab814d66ec7d8eb76064e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&371& data-rawheight=&171& class=&content_image& width=&371&&&/figure&&p&&br&多维数组同样也可以使用整数序列和布尔数组进行存取。&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-0d36a12f16d5eb5431eea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&534& data-rawheight=&260& class=&origin_image zh-lightbox-thumb& width=&534& data-original=&https://pic3.zhimg.com/v2-0d36a12f16d5eb5431eea_r.jpg&&&/figure&&p&&br&&/p&&ul&&li&a[(0,1,2,3,4),(1,2,3,4,5)] : 用于存取数组的下标和仍然是一个有两个元素的组元,组元中的每个元素都是整数序列,分别对应数组的第0轴和第1轴。从两个序列的对应位置取出两个整数组成 下标: a[0,1], a[1,2], ..., a[4,5]。&/li&&li&a[3:, [0, 2, 5]] : 下标中的第0轴是一个范围,它选取第3行之后的所有行;第1轴是整数序列,它选取第0, 2, 5三列。&/li&&li&a[mask, 2] : 下标的第0轴是一个布尔数组,它选取第0,2,5行;第1轴是一个整数,选取第2列。&/li&&/ul&&p&&b&2.1.4 结构数组&/b&&br&在C语言中我们可以通过struct关键字定义结构类型,结构中的字段占据连续的内存空间,每个结构体占用的内存大小都相同,因此可以很容易地定义 结构数组。和C语言一样,在NumPy中也很容易对这种结构数组进行操作。只要NumPy中的结构定义和C语言中的定义相同,NumPy就可以很方便地读 取C语言的结构数组的二进制数据,转换为NumPy的结构数组。&br&假设我们需要定义一个结构数组,它的每个元素都有name, age和weight字段。在NumPy中可以如下定义:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-f0e6bffe85ca_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&356& data-rawheight=&146& class=&content_image& width=&356&&&/figure&&p&&br&我们先创建一个dtype对象persontype,通过其字典参数描述结构类型的各个字段。字典有两个关键字:names,formats。每个关键字对应的值都是一个列表。names定义结构中的每个字段名,而formats则定义每个字段的类型:&br&&/p&&ul&&li&&b&S32&/b& : 32个字节的字符串类型,由于结构中的每个元素的大小必须固定,因此需要指定字符串的长度&/li&&li&&b&i&/b& : 32bit的整数类型,相当于np.int32&/li&&li&&b&f&/b& : 32bit的单精度浮点数类型,相当于np.float32&/li&&/ul&&p&然后我们调用array函数创建数组,通过关键字参数 dtype=persontype, 指定所创建的数组的元素类型为结构persontype。运行上面程序之后,我们可以在IPython中执行如下的语句查看数组a的元素类型&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-d4f797f6d5bf120dbc7aaab298e71eb7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&407& data-rawheight=&51& class=&content_image& width=&407&&&/figure&&p&&br&这里我们看到了另外一种描述结构类型的方法: 一个包含多个组元的列表,其中形如 (字段名, 类型描述) 的组元描述了结构中的每个字段。类型描述前面为我们添加了 '|', '&' 等字符,这些字符用来描述字段值的字节顺序:&br&&/p&&ul&&li&&b&|&/b& : 忽视字节顺序&/li&&li&&b&&&/b& : 低位字节在前&/li&&li&&b&&&/b& : 高位字节在前&/li&&/ul&&p&结构数组的存取方式和一般数组相同,通过下标能够取得其中的元素,注意元素的值看上去像是组元,实际上它是一个结构:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-b57c6a510beca9afba970_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&523& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-b57c6a510beca9afba970_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-db5fa12e86d5_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&632& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-db5fa12e86d5_r.jpg&&&/figure&&p&&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f4afe79a84b61b353f2ffd8d03f99ada_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&285& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic1.zhimg.com/v2-f4afe79a84b61b353f2ffd8d03f99ada_r.jpg&&&/figure&&p&&br&&b&2.1.5 内存结构&/b&&br&下面让我们来看看ndarray数组对象是如何在内存中储存的。如图2.3所示,关于数组的描述信息保存在一个数据结构中,这个结构引用两个对象:一块用于保存数据的存储区域和一个用于描述元素类型的dtype对象。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-64e1a0ac2eef7ce88a9fc2cc5363fded_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&500& data-rawheight=&280& class=&origin_image zh-lightbox-thumb& width=&500& data-original=&https://pic4.zhimg.com/v2-64e1a0ac2eef7ce88a9fc2cc5363fded_r.jpg&&&/figure&&p&&br&图2.3 ndarray数组对象在内存中的储存方式&br&数据存储区域保存着数组中所有元素的二进制数据,dtype对象则知道如何将元素的二进制数据转换为可用的值。数组的维数、大小等信息都保存在ndarray数组对象的数据结构中。图中显示的是如下数组的内存结构:&br&&&& a = np.array([[0,1,2],[3,4,5],[6,7,8]], dtype=np.float32)strides中保存的是当每个轴的下标增加1时,数据存储区中的指针所增加的字节数。例如图中的strides为12,4,即第0轴的下标增加1 时,数据的地址增加12个字节:即a[1,0]的地址比a[0,0]的地址要高12个字节,正好是3个单精度浮点数的总字节数;第1轴下标增加1时,数据 的地址增加4个字节,正好是单精度浮点数的字节数。&br&如果strides中的数值正好和对应轴所占据的字节数相同的话,那么数据在内存中是连续存储的。然而数据并不一定都是连续储存的,前面介绍过通过下标范围得到新的数组是原始数组的视图,即它和原始视图共享数据存储区域:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-b778d626e6fe9e2ac079_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&215& data-rawheight=&141& class=&content_image& width=&215&&&/figure&&p&&br&由于数组b和数组a共享数据存储区,而b中的第0轴和第1轴都是数组a中隔一个元素取一个,因此数组b的strides变成了24,8,正好都是数组a的两倍。 对照前面的图很容易看出数据0和2的地址相差8个字节,而0和6的地址相差24个字节。&br&元素在数据存储区中的排列格式有两种:C语言格式和Fortan语言格式。在C语言中,多维数组的第0轴是最上位的,即第0轴的下标增加1时,元素 的地址增加的字节数最多;而Fortan语言的多维数组的第0轴是最下位的,即第0轴的下标增加1时,地址只增加一个元素的字节数。在NumPy中,元素 在内存中的排列缺省是以C语言格式存储的,如果你希望改为Fortan格式的话,只需要给数组传递order=&F&参数:&br&&&& c = np.array([[0,1,2],[3,4,5],[6,7,8]], dtype=np.float32, order=&F&)&&& c.strides(4, 12)&b&2.2 ufunc运算&/b&&br&ufunc是universal function的缩写,它是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,因此它们的计算速度非常快。让我们来看一个例子:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-84d70dff2a48e122922d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&406& data-rawheight=&193& class=&content_image& width=&406&&&/figure&&p&&br&先用linspace产生一个从0到2*PI的等距离的10个数,然后将其传递给sin函数,由于np.sin是一个ufunc函数,因此它对x中 的每个元素求正弦值,然后将结果返回,并且赋值给y。计算之后x中的值并没有改变,而是新创建了一个数组保存结果。如果我们希望将sin函数所计算的结果 直接覆盖到数组x上去的话,可以将要被覆盖的数组作为第二个参数传递给ufunc函数。例如::&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-42fcb03ff04bf2e6390200_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&386& data-rawheight=&189& class=&content_image& width=&386&&&/figure&&p&&br&sin函数的第二个参数也是x,那么它所做的事情就是对x中的每给值求正弦值,并且把结果保存到x中的对应的位置中。此时函数的返回值仍然是整个计算的结果,只不过它就是x,因此两个变量的id是相同的(变量t和变量x指向同一块内存区域)。&br&我用下面这个小程序,比较了一下numpy.math和Python标准库的math.sin的计算速度::&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-a728c567d68f7dd02e84f57ecf76bea7_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&298& data-rawheight=&436& class=&content_image& width=&298&&&/figure&&p&&br&在我的电脑上计算100万次正弦值,numpy.sin比math.sin快10倍多。这得利于numpy.sin在C语言级别的循环计算。 numpy.sin同样也支持对单个数值求正弦,例如:numpy.sin(0.5)。不过值得注意的是,对单个数的计算math.sin则比 numpy.sin快得多了,让我们看下面这个测试程序:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-cc1f183b1a966d8c0ea893_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&300& data-rawheight=&186& class=&content_image& width=&300&&&/figure&&p&&br&请注意numpy.sin的计算速度只有math.sin的1/5。这是因为numpy.sin为了同时支持数组和单个值的计算,其C语言的内部实 现要比math.sin复杂很多,如果我们同样在Python级别进行循环的话,就会看出其中的差别了。此外,numpy.sin返回的数的类型和 math.sin返回的类型有所不同,math.sin返回的是Python的标准float类型,而numpy.sin则返回一个 numpy.float64类型:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-a9d0cde562aa6c401707_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&182& data-rawheight=&104& class=&content_image& width=&182&&&/figure&&p&&br&通过上面的例子我们了解了如何最有效率地使用math库和numpy库中的数学函数。因为它们各有长短,因此在导入时不建议使用*号全部载入,而是应该使用import numpy as np的方式载入,这样我们可以根据需要选择合适的函数调用。&br&NumPy中有众多的ufunc函数为我们提供各式各样的计算。除了sin这种单输入函数之外,还有许多多个输入的函数,add函数就是一个最常用的例子。先来看一个例子:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-8d18d92cc22f983beaf2240e4ece92ac_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&191& data-rawheight=&277& class=&content_image& width=&191&&&/figure&&p&&br&add函数返回一个新的数组,此数组的每个元素都为两个参数数组的对应元素之和。它接受第3个参数指定计算结果所要写入的数组,如果指定的话,add函数就不再产生新的数组。&br&由于Python的操作符重载功能,计算两个数组相加可以简单地写为a+b,而np.add(a,b,a)则可以用a+=b来表示。下面是数组的运 算符和其对应的ufunc函数的一个列表,注意除号&/&的意义根据是否激活__future__.division有所不同。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c12147adb479d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&526& data-rawheight=&253& class=&origin_image zh-lightbox-thumb& width=&526& data-original=&https://pic4.zhimg.com/v2-c12147adb479d_r.jpg&&&/figure&&p&&br&数组对象支持这些操作符,极大地简化了算式的编写,不过要注意如果你的算式很复杂,并且要运算的数组很大的话,会因为产生大量的中间结果而降低程序的运算效率。例如:假设a b c三个数组采用算式x=a*b+c计算,那么它相当于:&br&t = a * bx = t + cdel t也就是说需要产生一个数组t保存乘法的计算结果,然后再产生最后的结果数组x。我们可以通过手工将一个算式分解为x = a*b; x += c,以减少一次内存分配。&br&通过组合标准的ufunc函数的调用,可以实现各种算式的数组计算。不过有些时候这种算式不易编写,而针对每个元素的计算函数却很容易用 Python实现,这时可以用frompyfunc函数将一个计算单个元素的函数转换成ufunc函数。这样就可以方便地用所产生的ufunc函数对数组 进行计算了。让我们来看一个例子。&br&我们想用一个分段函数描述三角波,三角波的样子如图2.4所示:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-ffdfb698f79a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&640& data-rawheight=&278& class=&origin_image zh-lightbox-thumb& width=&640& data-original=&https://pic2.zhimg.com/v2-ffdfb698f79a_r.jpg&&&/figure&&p&&br&图2.4 三角波可以用分段函数进行计算&br&我们很容易根据上图所示写出如下的计算三角波某点y坐标的函数:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-01e783bc2842cfba5b00_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&442& data-rawheight=&138& class=&origin_image zh-lightbox-thumb& width=&442& data-original=&https://pic4.zhimg.com/v2-01e783bc2842cfba5b00_r.jpg&&&/figure&&p&&br&显然triangle_wave函数只能计算单个数值,不能对数组直接进行处理。我们可以用下面的方法先使用列表包容(List comprehension),计算出一个list,然后用array函数将列表转换为数组:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-5fbdc6e053f089bd4050c90_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&385& data-rawheight=&54& class=&content_image& width=&385&&&/figure&&p&&br&这种做法每次都需要使用列表包容语法调用函数,对于多维数组是很麻烦的。让我们来看看如何用frompyfunc函数来解决这个问题:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c6a3a188e483b0bbb9e10adfe07f81ec_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&510& data-rawheight=&51& class=&origin_image zh-lightbox-thumb& width=&510& data-original=&https://pic1.zhimg.com/v2-c6a3a188e483b0bbb9e10adfe07f81ec_r.jpg&&&/figure&&p&&br&frompyfunc的调用格式为frompyfunc(func, nin, nout),其中func是计算单个元素的函数,nin是此函数的输入参数的个数,nout是此函数的返回值的个数。虽然triangle_wave函数 有4个参数,但是由于后三个c, c0, hc在整个计算中值都是固定的,因此所产生的ufunc函数其实只有一个参数。为了满足这个条件,我们用一个lambda函数对 triangle_wave的参数进行一次包装。这样传入frompyfunc的函数就只有一个参数了。这样子做,效率并不是太高,另外还有一种方法:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-99a075fbf089bb6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&481& data-rawheight=&294& class=&origin_image zh-lightbox-thumb& width=&481& data-original=&https://pic4.zhimg.com/v2-99a075fbf089bb6_r.jpg&&&/figure&&p&&br&我们通过函数triangle_func包装三角波的三个参数,在其内部定义一个计算三角波的函数trifunc,trifunc函数在调用时会采用triangle_func的参数进行计算。最后triangle_func返回用frompyfunc转换结果。&br&值得注意的是用frompyfunc得到的函数计算出的数组元素的类型为object,因为frompyfunc函数无法保证Python函数返回的数据类型都完全一致。因此还需要再次 y2.astype(np.float64)将其转换为双精度浮点数组。&br&&b&2.2.1 广播&/b&&br&当我们使用ufunc函数对两个数组进行计算时,ufunc函数会对这两个数组的对应元素进行计算,因此它要求这两个数组有相同的大小(shape相同)。如果两个数组的shape不同的话,会进行如下的广播(broadcasting)处理:&br&&/p&&ol&&li&让所有输入数组都向其中shape最长的数组看齐,shape中不足的部分都通过在前面加1补齐&/li&&li&输出数组的shape是输入数组shape的各个轴上的最大值&/li&&li&如果输入数组的某个轴和输出数组的对应轴的长度相同或者其长度为1时,这个数组能够用来计算,否则出错&/li&&li&当输入数组的某个轴的长度为1时,沿着此轴运算时都用此轴上的第一组值&/li&&/ol&&p&上述4条规则理解起来可能比较费劲,让我们来看一个实际的例子。&br&先创建一个二维数组a,其shape为(6,1):&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c2c92e037dcd1e4d625d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&282& data-rawheight=&270& class=&content_image& width=&282&&&/figure&&p&&br&计算a和b的和,得到一个加法表,它相当于计算a,b中所有元素组的和,得到一个shape为(6,5)的数组:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-650cc701fd48a2a1dd02e74a85dc264e_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&209& data-rawheight=&234& class=&content_image& width=&209&&&/figure&&p&&br&由于a和b的shape长度(也就是ndim属性)不同,根据规则1,需要让b的shape向a对齐,于是将b的shape前面加1,补齐为(1,5)。相当于做了如下计算:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d63f5de154cc2_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&166& data-rawheight=&71& class=&content_image& width=&166&&&/figure&&p&&br&这样加法运算的两个输入数组的shape分别为(6,1)和(1,5),根据规则2,输出数组的各个轴的长度为输入数组各个轴上的长度的最大值,可知输出数组的shape为(6,5)。&br&由于b的第0轴上的长度为1,而a的第0轴上的长度为6,因此为了让它们在第0轴上能够相加,需要将b在第0轴上的长度扩展为6,这相当于:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-de426bb9ecf9152ef37aea_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&176& data-rawheight=&188& class=&content_image& width=&176&&&/figure&&p&&br&由于a的第1轴的长度为1,而b的第一轴长度为5,因此为了让它们在第1轴上能够相加,需要将a在第1轴上的长度扩展为5,这相当于:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-31f8f1e7a803ea71fbc259bbfe93ba27_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&348& data-rawheight=&219& class=&content_image& width=&348&&&/figure&&p&&br&当然,numpy在执行a+b运算时,其内部并不会真正将长度为1的轴用repeat函数进行扩展,如果这样做的话就太浪费空间了。&br&由于这种广播计算很常用,因此numpy提供了一个快速产生如上面a,b数组的方法: ogrid对象:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-768ab7fe2ac0_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&214& data-rawheight=&202& class=&content_image& width=&214&&&/figure&&p&&br&ogrid是一个很有趣的对象,它像一个多维数组一样,用切片组元作为下标进行存取,返回的是一组可以用来广播计算的数组。其切片下标有两种形式:&br&&/p&&ul&&li&开始值:结束值:步长,和np.arange(开始值, 结束值, 步长)类似&/li&&li&开始值:结束值:长度j,当第三个参数为虚数时,它表示返回的数组的长度,和np.linspace(开始值, 结束值, 长度)类似:&/li&&/ul&&figure&&img src=&https://pic4.zhimg.com/v2-d0be8e84ee_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&235& data-rawheight=&187& class=&content_image& width=&235&&&/figure&&p&&br&ogrid为什么不是函数&br&根据Python的语法,只有在中括号中才能使用用冒号隔开的切片语法,如果ogrid是函数的话,那么这些切片必须使用slice函数创建,这显然会增加代码的长度。&br&利用ogrid的返回值,我能很容易计算x, y网格面上各点的值,或者x, y, z网格体上各点的值。下面是绘制三维曲面 x * exp(x**2 - y**2) 的程序:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-f6be61d608be4f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&307& data-rawheight=&210& class=&content_image& width=&307&&&/figure&&p&&br&此程序使用mayavi的mlab库快速绘制如图2.5所示的3D曲面,关于mlab的相关内容将在今后的章节进行介绍。&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-cedd383a7addccb27299b6_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&404& data-rawheight=&322& class=&content_image& width=&404&&&/figure&&p&&br&图2.5 使用ogrid创建的三维曲面&br&&b&2.2.2 ufunc的方法&/b&&br&ufunc函数本身还有些方法,这些方法只对两个输入一个输出的ufunc函数有效,其它的ufunc对象调用这些方法时会抛出ValueError异常。&br&&b&reduce&/b& 方法和Python的reduce函数类似,它沿着axis轴对array进行操作,相当于将&op&运算符插入到沿axis轴的所有子数组或者元素当中。&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-d96e796ceebcaca53d3efa_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&394& data-rawheight=&171& class=&content_image& width=&394&&&/figure&&p&&br&&b&accumulate&/b& 方法和reduce方法类似,只是它返回的数组和输入的数组的shape相同,保存所有的中间计算结果:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-bb_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&316& data-rawheight=&122& class=&content_image& width=&316&&&/figure&&p&&br&&b&reduceat&/b& 方法计算多组reduce的结果,通过indices参数指定一系列reduce的起始和终了位置。reduceat的计算有些特别,让我们通过一个例子来解释一下:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-22cab14f4d90_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&341& data-rawheight=&98& class=&content_image& width=&341&&&/figure&&p&&br&对于indices中的每个元素都会调用reduce函数计算出一个值来,因此最终计算结果的长度和indices的长度相同。结果result数组中除最后一个元素之外,都按照如下计算得出:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-ec31f71ae_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&321& data-rawheight=&365& class=&content_image& width=&321&&&/figure&&p&&br&可以看出result[::2]和a相等,而result[1::2]和np.add.accumulate(a)相等。&br&&b&outer&/b& 方法,&op&.outer(a,b)方法的计算等同于如下程序:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-e8d124b3098bea9b0203_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&204& data-rawheight=&79& class=&content_image& width=&204&&&/figure&&p&&br&其中squeeze的功能是剔除数组a中长度为1的轴。如果你看不太明白这个等同程序的话,让我们来看一个例子:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a60fe0c2b19b963a1f4ae77_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&284& data-rawheight=&139& class=&content_image& width=&284&&&/figure&&p&&br&可以看出通过outer方法计算的结果是如下的乘法表:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c0a9acc66d81f615e93c22cb8769d6ac_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&578& data-rawheight=&170& class=&origin_image zh-lightbox-thumb& width=&578& data-original=&https://pic4.zhimg.com/v2-c0a9acc66d81f615e93c22cb8769d6ac_r.jpg&&&/figure&&p&&br&&b&2.3 矩阵运算&/b&&br&NumPy和Matlab不一样,对于多维数组的运算,缺省情况下并不使用矩阵运算,如果你希望对数组进行矩阵运算的话,可以调用相应的函数。&br&matrix对象&br&numpy库提供了matrix类,使用matrix类创建的是矩阵对象,它们的加减乘除运算缺省采用矩阵方式计算,因此用法和matlab十分类 似。但是由于NumPy中同时存在ndarray和matrix对象,因此用户很容易将两者弄混。这有违Python的“显式优于隐式”的原则,因此并不 推荐在较复杂的程序中使用matrix。下面是使用matrix的一个例子:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-7c2cb51a2cb61b06ad81c63b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&409& data-rawheight=&129& class=&content_image& width=&409&&&/figure&&p&&br&因为a是用matrix创建的矩阵对象,因此乘法和幂运算符都变成了矩阵运算,于是上面计算的是矩阵a和其逆矩阵的乘积,结果是一个单位矩阵。&br&矩阵的乘积可以使用dot函数进行计算。对于二维数组,它计算的是矩阵乘积,对于一维数组,它计算的是其点积。当需要将一维数组当作列矢量或者行矢量进行矩阵运算时,推荐先使用reshape函数将一维数组转换为二维数组:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-4ba81104a77aaca4c1f5af_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&203& data-rawheight=&161& class=&content_image& width=&203&&&/figure&&p&&br&除了dot计算乘积之外,NumPy还提供了inner和outer等多种计算乘积的函数。这些函数计算乘积的方式不同,尤其是当对于多维数组的时候,更容易搞混。&br&&/p&&ul&&li&&b&dot&/b& : 对于两个一维的数组,计算的是这两个数组对应下标元素的乘积和(数学上称之为内积);对于二维数组,计算的是两个数组的矩阵乘积;对于多维数组,它的通用 计算公式如下,即结果数组中的每个元素都是:数组a的最后一维上的所有元素与数组b的倒数第二位上的所有元素的乘积和:&/li&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-d04a8e5aa51c1fa6f158_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&420& data-rawheight=&398& class=&content_image& width=&420&&&/figure&&p&&br&&b&inner&/b& : 和dot乘积一样,对于两个一维数组,计算的是这两个数组对应下标元素的乘积和;对于多维数组,它计算的结果数组中的每个元素都是:数组a和b的最后一维的内积,因此数组a和b的最后一维的长度必须相同:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-20de4c592c5f89bf74c939a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&336& data-rawheight=&318& class=&content_image& width=&336&&&/figure&&p&&br&&b&outer&/b& : 只按照一维数组进行计算,如果传入参数是多维数组,则先将此数组展平为一维数组之后再进行运算。outer乘积计算的列向量和行向量的矩阵乘积:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-bb9a8f239e3a405ed1afbbc22c99c43b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&245& data-rawheight=&99& class=&content_image& width=&245&&&/figure&&p&&br&矩阵中更高级的一些运算可以在NumPy的线性代数子库linalg中找到。例如inv函数计算逆矩阵,solve函数可以求解多元一次方程组。下面是solve函数的一个例子:&br&&/p&&figure&&img src=&https://pic1.zhimg.com/v2-43b3c4ca1258eaefb621dca_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&244& data-rawheight=&121& class=&content_image& width=&244&&&/figure&&p&&br&solve函数有两个参数a和b。a是一个N*N的二维数组,而b是一个长度为N的一维数组,solve函数找到一个长度为N的一维数组x,使得a和x的矩阵乘积正好等于b,数组x就是多元一次方程组的解。&br&有关线性代数方面的内容将在今后的章节中详细介绍。&br&&b&2.4 文件存取&/b&&br&NumPy提供了多种文件操作函数方便我们存取数组内容。文件存取的格式分为两类:二进制和文本。而二进制格式的文件又分为NumPy专用的格式化二进制类型和无格式类型。&br&使用数组的方法函数tofile可以方便地将数组中数据以二进制的格式写进文件。tofile输出的数据没有格式,因此用numpy.fromfile读回来的时候需要自己格式化数据:&br&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-31bc494392edd6c42287_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&434& data-rawheight=&472& class=&origin_image zh-lightbox-thumb& width=&434& data-original=&https://pic3.zhimg.com/v2-31bc494392edd6c42287_r.jpg&&&/figure&&p&&br&从上面的例子可以看出,需要在读入的时候设置正确的dtype和shape才能保证数据一致。并且tofile函数不管数组的排列顺序是C语言格式的还是Fortran语言格式的,统一使用C语言格式输出。&br&此外如果fromfile和tofile函数调用时指定了sep关键字参数的话,数组将以文本格式输入输出。&br&numpy.load和numpy.save函数以NumPy专用的二进制类型保存数据,这两个函数会自动处理元素类型和shape等信息,使用它们读写数组就方便多了,但是numpy.save输出的文件很难和其它语言编写的程序读入:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-958e1baa97a1d_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&206& data-rawheight=&142& class=&content_image& width=&206&&&/figure&&p&&br&如果你想将多个数组保存到一个文件中的话,可以使用numpy.savez函数。savez函数的第一个参数是文件名,其后的参数都是需要保存的数 组,也可以使用关键字参数为数组起一个名字,非关键字参数传递的数组会自动起名为arr_0, arr_1, ...。savez函数输出的是一个压缩文件(扩展名为npz),其中每个文件都是一个save函数保存的npy文件,文件名对应于数组名。load函数 自动识别npz文件,并且返回一个类似于字典的对象,可以通过数组名作为关键字获取数组的内容:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-e2ff63a8a47fdd6a7d8f9a3a67a55212_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&459& data-rawheight=&305& class=&origin_image zh-lightbox-thumb& width=&459& data-original=&https://pic4.zhimg.com/v2-e2ff63a8a47fdd6a7d8f9a3a67a55212_r.jpg&&&/figure&&p&&br&如果你用解压软件打开result.npz文件的话,会发现其中有三个文件:arr_0.npy, arr_1.npy, sin_array.npy,其中分别保存着数组a, b, c的内容。&br&使用numpy.savetxt和numpy.loadtxt可以读写1维和2维的数组:&br&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-5b4cf50e565d2a871d48f_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&504& data-rawheight=&294& class=&origin_image zh-lightbox-thumb& width=&504& data-original=&https://pic4.zhimg.com/v2-5b4cf50e565d2a871d48f_r.jpg&&&/figure&&p&&br&文件名和文件对象&br&本节介绍所举的例子都是传递的文件名,也可以传递已经打开的文件对象,例如对于load和save函数来说,如果使用文件对象的话,可以将多个数组储存到一个npy文件中:&br&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-a00dd01e1a03e39a180b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&298& data-rawheight=&336& class=&content_image& width=&298&&&/figure&&p&&br&&b&一、数组方法&/b&&br&创建数组:arange()创建一维数组;array()创建一维或多维数组,其参数是类似于数组的对象,如列表等&br&创建数组:np.zeros((2,3)),或者np.ones((2,3)),参数是一个元组分别表示行数和列数&br&对应元素相乘,a * b,得到一个新的矩阵,形状要一致;但是允许a是向量而b是矩阵,a的列数必须等于b的列数,a与每个行向量点乘&br&+ - / 与 * 的运算规则相同。&br&数学上定义的矩阵乘法 np.dot(a, b)。如果形状不匹配会报错;但是允许允许a和b都是向量,返回两个向量的内积。只要有一个参数不是向量,就应用矩阵乘法。&br&(PS:总之就是,向量很特殊,在运算中可以自由转置而不会出错,运算的返回值如果维度为1,也一律用行向量[]表示)&br&读取数组元素:如a[0],a[0,0]&br&数组变形:如b=a.reshape(2,3,4)将得到原数组变为2*3*4的三维数组后的数组;或是a.shape=(2,3,4)或a.resize(2,3,4)直接改变数组a的形状&br&数组组合:水平组合hstack((a,b))或concatenate((a,b),axis=1);垂直组合vstack((a,b))或concatenate((a,b),axis=0);深度组合dstack((a,b))&br&数组分割(与数组组合相反):分别有hsplit,vsplit,dsplit,split(split与concatenate相对应)&br&将np数组变为py列表:a.tolist()&br&数组排序(小到大):列排列np.msort(a),行排列np.sort(a),np.argsort(a)排序后返回下标&br&复数排序:np.sort_complex(a)按先实部后虚部排序&br&数组的插入:np.searchsorted(a,b)将b插入原有序数组a,并返回插入元素的索引值&br&类型转换:如a.astype(int),np的数据类型比py丰富,且每种类型都有转换方法&br&条件查找,返回满足条件的数组元素的索引值:np.where(条件)&br&条件查找,返回下标:np.argwhere(条件)&br&条件查找,返回满足条件的数组元素:np.extract([条件],a)&br&根据b中元素作为索引,查找a中对应元素:np.take(a,b)一维&br&数组中最小最大元素的索引:np.argmin(a),np.argmax(a)&br&多个数组的对应位置上元素大小的比较:np.maximum(a,b,c,…..)返回每个索引位置上的最大值,np.minimum(…….)相反&br&将a中元素都置为b:a.fill(b)&br&每个数组元素的指数:np.exp(a)&br&生成等差行向量:如np.linspace(1,6,10)则得到1到6之间的均匀分布,总共返回10个数&br&求余:np.mod(a,n)相当于a%n,np.fmod(a,n)仍为求余且余数的正负由a决定&br&计算平均值:np.mean(a)&br&计算最大值:amax(a, axis=None, out=None, keepdims=False) 。Return the maximum of an array or maximum along an axis.&br&计算加权平均值:np.average(a,b),其中b是权重&br&计算数组的极差:np.pth(a)=max(a)-min(a)&br&计算方差(总体方差):np.var(a)&br&标准差:np.std(a)&br&算术平方根,a为浮点数类型:np.sqrt(a)&br&对数:np.log(a)&br&修剪数组,将数组中小于x的数均换为x,大于y的数均换为y:a.clip(x,y)&br&所有数组元素乘积:a.prod()&br&数组元素的累积乘积:a.cumprod()&br&数组元素的符号:np.sign(a),返回数组中各元素的正负符号,用1和-1表示&br&数组元素分类:np.piecewise(a,[条件],[返回值]),分段给定取值,根据判断条件给元素分类,并返回设定的返回值。&br&判断两数组是否相等: np.array_equal(a,b)&br&判断数组元素是否为实数: np.isreal(a)&br&去除数组中首尾为0的元素:np.trim_zeros(a)&br&对浮点数取整,但不改变浮点数类型:np.rint(a)&br&&b&二、数组属性&/b&&br&1.获取数组每一维度的大小:a.shape&br&2.获取数组维度:a.ndim&br&3.元素个数:a.size&br&4.数组元素在内存中的字节数:a.itemsize&br&5.数组字节数:a.nbytes==a.size*a.itemsize&br&6.数组元素覆盖:a.flat=1,则a中数组元素都被1覆盖&br&7.数组转置:a.T&br&不能求逆、求协方差、迹等,不适用于复杂科学计算,可以将array转换成matrix。&br&&b&三、矩阵方法&/b&&br&创建矩阵:np.mat(‘…’)通过字符串格式创建,np.mat(a)通过array数组创建,也可用matrix或bmat函数创建&br&创建复合矩阵:np.bmat(‘A B’,’AB’),用A和B创建复合矩阵AB(字符串格式)&br&创建n*n维单位矩阵:np.eye(n)&br&矩阵的转置:A.T&br&矩阵的逆矩阵:A.I&br&计算协方差矩阵:np.cov(x),np.cov(x,y)&br&计算矩阵的迹(对角线元素和):a.trace()&br&相关系数:np.corrcoef(x,y)&br&给出对角线元素:a.diagonal()&br&&b&四、线性代数&/b&&br&估计线性模型中的系数:a=np.linalg.lstsq(x,b),有b=a*x&br&求方阵的逆矩阵:np.linalg.inv(A)&br&求广义逆矩阵:np.linalg.pinv(A)&br&求矩阵的行列式:np.linalg.det(A)&br&解形如AX=b的线性方程组:np.linalg.solve(A,b)&br&求矩阵的特征值:np.linalg.eigvals(A)&br&求特征值和特征向量:np.linalg.eig(A)&br&Svd分解:np.linalg.svd(A)&br&&b&五、概率分布&/b&&br&产生二项分布的随机数:np.random.binomial(n,p,size=…),其中n,p,size分别是每轮试验次数、概率、轮数&br&产生超几何分布随机数:np.random.hypergeometric(n1,n2,n,size=…),其中参数意义分别是物件1总量、物件2总量、每次采样数、试验次数&br&产生N个正态分布的随机数:np.random.normal(均值,标准差,N)&br&产生N个对数正态分布的随机数:np.random.lognormal(mean,sigma,N)&br&&b&六、多项式&/b&&br&多项式拟合:poly= np.polyfit(x,a,n),拟合点集a得到n级多项式,其中x为横轴长度,返回多项式的系数&br&多项式求导函数:np.polyder(poly),返回导函数的系数&br&得到多项式的n阶导函数:多项式.deriv(m = n)&br&多项式求根:np.roots(poly)&br&多项式在某点上的值:np.polyval(poly,x[n]),返回poly多项式在横轴点上x[n]上的值&br&两个多项式做差运算: np.polysub(a,b)&br&Matpoltlib简单绘图方法&br&引入简单绘图的包import matplotlib.pyplot as plt,最后用plt.show()显示图像&br&基本画图方法:plt.plot(x,y),plt.xlabel(‘x’),plt.ylabel(‘y’),plt.title(‘…’)&br&子图:plt.subplot(abc),其中abc分别表示子图行数、列数、序号&br&创建绘图组件的顶层容器:fig = plt.figure()&br&添加子图:ax = fig.add_subplot(abc)&br&设置横轴上的主定位器:ax.xaxis.set_major_locator(…)&br&绘制方图:plt.hist(a,b),a为长方形的左横坐标值,b为柱高&br&绘制散点图:plt.scatter(x,y,c = ‘..’,s = ..),c表示颜色,s表示大小&br&添加网格线:plt.grid(True)&br&添加注释:如ax.annotate('x', xy=xpoint, textcoords='offsetpoints',xytext=(-50, 30), arrowprops=dict(arrowstyle=&-&&))&br&增加图例:如plt.legend(loc='best', fancybox=True)&br&对坐标取对数:横坐标plt.semilogx(),纵坐标plt.semilogy(),横纵同时plt.loglog()&br&在此所写文章做成笔记记录的形式,书写代码过程中难免取之互联网,有的是本人书写,推崇自己一些见解想法,在看文章之前呢,小编推荐一个群,群里分子非常踊跃交流经验遇坑问题,也有初学者交流讨论,群内整理了也整理了大量的PDF书籍和学习资料,程序员也很热心的帮助解决问题,还有讨论工作上的解决方案,非常好的学习交流地方!喜欢python的朋友可以加入:719-139-688欢迎大家交流讨论各种奇技淫巧,一起快速成长&/p&&p&&/p&
标准安装的Python中用列表(list)保存一组值,可以用来当作数组使用,不过由于列表的元素可以是任何对象,因此列表中所保存的是对象的指 针。这样为了保存一个简单的[1,2,3],需要有3个指针和三个整数对象。对于数值运算来说这种结构显然比较浪费内存和CPU计…
&p&&b&一、规划&/b&&/p&&p&&br&&/p&&p&slogan:做中国好馒头、做好中国馒头&/p&&p&&br&&/p&&p&使命:让全中国人重新吃上安心馒头&/p&&p&&br&&/p&&p&愿景:成为世界顶级的馒头品牌&/p&&p&&br&&/p&&p&广告语:这一口,谁不爱&/p&&p&&br&&/p&&p&目标人群:新中产阶级&/p&&p&&br&&/p&&p&新中产消费观的最大特征:相较于价格,他们在意质量,对于高质量的商品和服务,他们愿意为之付出更高的代价。较高的收入与体面的工作给中产带来片刻的欣慰,但不安与焦虑才是中产光鲜外表下最戳心的痛点,消费升级正是他们面对这种焦虑选择的解决方案。&/p&&p&&br&&/p&&p&&b&二、设计&/b&&/p&&p&&br&&/p&&p&1.品牌&/p&&p&品牌要能让人产生联想,要好记,比如:&真馒头&&/p&&p&&br&&/p&&p&2.设计&/p&&p&包装要讲究,但重点是一定要去德国买一个红点奖。&/p&&p&每个包装上,还必须有扎心的文案,比如:&/p&&p&我们拼尽全力,不是为了活成别人想要的模样&/p&&p&你只来了一下子,却改变了我一辈子&/p&&p&我有馒头,你有故事吗?&/p&&p&&br&&/p&&p&3.产品&/p&&p&要秉承匠心精神,只做单一产品--真o葱花馒头,将一款产品做到极致。&/p&&p&但是可以根据用户人群推出专属款,比如&/p&&p&有助记忆力的儿童款&/p&&p&提高睡眠质量的老人款&/p&&p&&br&&/p&&p&4.门店&/p&&p&不同类型的门店来满足用户多元化的场景需求,包括满足用户线下社交需求的旗舰店,满足亲子活动的DIY体验店,以及快速自提、服务商务人群的快取店,满足客户外送需求的外卖厨房店。通过差异化的门店布局,实现对消费者日常生活全方位覆盖。&/p&&p&&br&&/p&&p&5.定价&/p&&p&统一价19.9元!!没有足够的利润空间,618、双11、双12你拿什么打折?&/p&&p&&br&&/p&&p&&b&三、营销&/b&&/p&&p&&br&&/p&&p&1.讲故事&/p&&p&馒头的面全部来自北纬36°黄金优麦区种植的8848号小麦,纯手工脱粒。&/p&&p&蒸馒头的水,选自长白山矿物质水,再经过36道工艺人工萃取。&/p&&p&创新思维碰撞传统手工技艺,再造中国馒头新未来。&/p&&p&&br&&/p&&p&2.讲情怀&/p&&p&创始人211名校毕业后,放弃BTA百万年薪自主创业;尝遍了全国各地大街小巷所有的馒头,拜访数十位隐居的大师,经历了同事朋友的嘲讽、女朋友的离等非常人所能经历的磨难后,终于发明了拥有独特、唯一口味的&真馒头&。&/p&&p&&br&&/p&&p&3.软文推广&/p&&p&《震惊!男人吃了沉默,女人吃了流泪》&/p&&p&《感动!一个馒头如果没有情怀,那它和面粉有什么区别》&/p&&p&《刚刚!人人都在疯抢这款馒头》&/p&&p&...&/p&&p&&br&&/p&&p&4.造气氛&/p&&p&找很多人来回排队,不用多讲,这是网红店的标配。但是排队的人员组成还是要有讲究的,需要有学生、青年、白领、中年人,而且不能一起到,要分批到。&/p&&p&&br&&/p&&p&5.制造热点事件&/p&&p&哭诉鹅厂抄袭商业模式&/p&&p&喊话某互联网大佬,打赌3年后比营业额&/p&&p&&br&&/p&&p&6.社会化传播&/p&&p&赞助绝地求生,新增能量馒头,吃一个血条全满!&/p&&p&雇人拿着馒头去starbuck、costa,让咖啡、苹果笔记本、馒头成为新一代的装B三件套。&/p&&p&抢在韩国人前为馒头申遗!&/p&&p&&br&&/p&&p&7.微微一抖&/p&&p&微博:每天去抢杜蕾斯、回忆专用小马甲的沙发,设置转发有奖活动;&/p&&p&&br&&/p&&p&微信公众号:每天深夜10点,推送一条荷尔蒙满满的语音鸡汤,一定要煽情!&/p&&p&&br&&/p&&p&抖音:做一个卡通吉祥物,天天耍贱,卖萌,用户爱看什么拍什么。&/p&&p&&br&&/p&&p&8.饥饿营销&/p&&p&每家门店每天限量8888个,卖完即止。第二天的馒头需要提前预约。&/p&&p&&br&&/p&&p&9.裂变营销&/p&&p&给好友免费送馒头,他吃你也吃。&/p&&p&&br&&/p&&p&10.社群运营&/p&&p&建立真馒头的粉丝群,收集种子用户的建议反馈,经常与粉丝互动。邀请5个人进群可免费领取一个馒头,群成员可享受新品内测试吃福利。&/p&&p&&br&&/p&&p&11.APP运营&/p&&p&开启步数兑换优惠券功能,倡导绿色出行;&/p&&p&消费有积分,积分可以浇水种小麦,小麦长成后可以直接磨成面,寄给用户。&/p&&p&增加交友功能,注册必须上传吃馒头的自拍照,可以查看5公里内异性用户的照片,但是必须相互点赞,才能加好友聊天。&/p&&p&&br&&/p&&p&12.会员体系&/p&&p&充值5000黄金会员,享8折优惠;充值10000白金会员,全部5折,生日赠送定制版馒头。&/p&&p&&br&&/p&&p&13.配送模式&/p&&p&可以在APP或公众号上自助完成下单,下单时可以选择温度、辣度等,制作好了系统会发提示,凭二维码领取,节约排队时间;如果选择外送,在已经开通的外送区域15分钟左右送到,超过30分钟免费。&/p&&p&&br&&/p&&p&&b&四、实现盈利&/b&&/p&&p&&br&&/p&&p&炒作互联网新零售+馒头的成功之道,然后花钱发一堆新闻通稿,进行大量商业路演,约见各类投资机构,重点来了:&/p&&p&想要快速套现的可以选择阿里的投资,2年内一定会被全资收购;&/p&&p&想要上市的优选搜狐的投资,直接搭建境外架构,3年后妥妥纳斯达克敲钟。&/p&&p&&br&&/p&&p&最后你们一定会问,你谁啊,靠不靠谱啊?&/p&&p&“&b&我,秦始皇,打钱!&/b&”&/p&&p&&br&&/p&&p&&b&传送门:&/b&&/p&&a href=&https://zhuanlan.zhihu.com/p/& data-draft-node=&block& data-draft-type=&link-card& class=&internal&&奔跑的大叔:营销文案黄金法则:引导消费者快速下单&/a&
一、规划 slogan:做中国好馒头、做好中国馒头 使命:让全中国人重新吃上安心馒头 愿景:成为世界顶级的馒头品牌 广告语:这一口,谁不爱 目标人群:新中产阶级 新中产消费观的最大特征:相较于价格,他们在意质量,对于高质量的商品和服务,他们愿意为之付…
&figure&&img src=&https://pic4.zhimg.com/v2-a96abfd4269ac_b.jpg& data-rawwidth=&600& data-rawheight=&354& class=&origin_image zh-lightbox-thumb& width=&600& data-original=&https://pic4.zhimg.com/v2-a96abfd4269ac_r.jpg&&&/figure&&p&笔记作者:Jim Liang&/p&&blockquote&近日,来自SAP(全球第一大商业软件公司)的梁劲(Jim Liang)公开了自己所写的一份 520 页的学习教程(英文版),详细、明了地介绍了机器学习中的相关概念、数学知识和各种经典算法。机器之心看到后,也迫不及待的推广给更多的读者。完整的 PDF 请从文后作者公开的链接下载。 &/blockquote&&p&在介绍中,Jim Liang 写到:&/p&&blockquote&人工智能是这两年风头正劲的领域,也是未来具有颠覆性可能的新领域。不少人尝试去学习机器学习相关的知识。然而,一旦越过最初的 overview 阶段,很多人就开始打退堂鼓了,然后迅速放弃。&br&&br&为什么会这样?&br&&br&&b&极 高 的 学 习 曲 线&/b&&/blockquote&&ul&&li&首当其冲就是数学,涉及统计学、微积分、概率、线性代数等,大家虽然都学过高等数学,但如果你还记得里面的细节,算你牛。更可能的情况是,多数人都对高等数学忘记了,面对各种算法里的大量公式,感到厌恶,甚至恐惧。&/li&&li&其次因为机器学习本身是一个综合性学科,而且是一个快速发展的学科,知识点散乱,缺乏系统性。&/li&&li&市面上的机器学习/深度学习书籍、文章、教程,遍地开花,但能以清晰的方式表达、循序渐进地讲解的教程,其实不多,大量的教程没有考虑到学习者的基础,使得初学者感到挫败和困惑。&/li&&/ul&&blockquote&&b&图 解 机 器 学 习&/b& &br&&br&正是对机器学习的过程中的痛苦有切身体会,我希望能做一份教程,以浅显易懂的方式去讲解它,降低大家的学习门槛。我为此花费了数月时间,经常做到深夜,把自己的学习笔记整理成了这份教程。&/blockquote&&p&&br&&/p&&p&&b&从结构来看,全部教程包含两部分:&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-d007aa657d21cc92bd42b1a_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&612& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic3.zhimg.com/v2-d007aa657d21cc92bd42b1a_r.jpg&&&/figure&&p&Part 1 介绍了基本概念,包括:&/p&&ul&&li&机器学习的流程&/li&&li&数据处理&/li&&li&建模&/li&&li&评估指标(如 MSE、ROC 曲线)&/li&&li&模型部署&/li&&li&过度拟合&/li&&li&正则化等&/li&&/ul&&p&在第一部分,作者先介绍了如今应用普遍的机器学习:从自动驾驶、语音助手到机器人。其中有些思想,也是众多读者们了解过的,例如:为何机器学习在这个时候会火(大数据、计算力、更好的算法);机器学习、人工智能、深度学习三者的关系等。&/p&&p&除了这些基础概念,这份教程也对机器学习模型的开发流程做了图像化展示(如下图),即使对此不太了解的读者,也能通过这种流程展示有所学习。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-57d50f60c6b062a9156feb1fe76b8748_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&778& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic1.zhimg.com/v2-57d50f60c6b062a9156feb1fe76b8748_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-850ce9b7_b.jpg& data-size=&normal& data-rawwidth=&1080& data-rawheight=&557& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic4.zhimg.com/v2-850ce9b7_r.jpg&&&figcaption&建立机器学习解决方案的步骤 &/figcaption&&/figure&&p&在 Part1 的其他小节,作者以类似的图像展示,对数据、建模、模型部署等内容做了详细介绍,这里就不一一列举,可以从原报告查看。&/p&&p&在 Part2,作者介绍了 常用的算法,包括:&/p&&ul&&li&线性回归&/li&&li&逻辑回归&/li&&li&神经网络&/li&&li&SVM&/li&&li&Knn&/li&&li&K-Means&/li&&li&决策树&/li&&li&随机森林&/li&&li&AdaBoost&/li&&li&朴素贝叶斯&/li&&li&梯度下降&/li&&li&主成分分析&/li&&/ul&&p&这部分包含了大量的数学公式,但作者尽力注解了其中的每个公式,从而充分、清晰地表达了众多数学概念。&/p&&p&例如在「神经网络」部分,作者整理了 59 页的笔记(从 311 页到 369 页)。作者从人脑中的神经元架构说起,介绍了人工神经网络(ANN)、人工神经元工作的原理。这份笔记非常注重图像化的概念解释,理解起来非常直观。&/p&&p&例如,下图中的概念解释很形象地展现了生物神经元和人工神经元工作方式的相似性。&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c34c4c300bac0bd8ee6250_b.jpg& data-size=&normal& data-rawwidth=&874& data-rawheight=&226& class=&origin_image zh-lightbox-thumb& width=&874& data-original=&https://pic1.zhimg.com/v2-c34c4c300bac0bd8ee6250_r.jpg&&&figcaption&生物神经元的树突输入-轴突输出模式和人工神经元的输入输出模式对比&/figcaption&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-c5de69b9d7_b.jpg& data-size=&normal& data-rawwidth=&913& data-rawheight=&331& class=&origin_image zh-lightbox-thumb& width=&913& data-original=&https://pic4.zhimg.com/v2-c5de69b9d7_r.jpg&&&figcaption&过拟合的解释&/figcaption&&/figure&&figure&&img src=&https://pic1.zhimg.com/v2-8e0b679dbe9a0750cdcae18_b.jpg& data-size=&normal& data-rawwidth=&868& data-rawheight=&812& class=&origin_image zh-lightbox-thumb& width=&868& data-original=&https://pic1.zhimg.com/v2-8e0b679dbe9a0750cdcae18_r.jpg&&&figcaption&人工神经元的基础结构&/figcaption&&/figure&&p&在涉及到数学公式时,作者会在旁边有详细的注解,如下图所示:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-7cfcef643b_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&1080& data-rawheight=&518& class=&origin_image zh-lightbox-thumb& width=&1080& data-original=&https://pic4.zhimg.com/v2-7cfcef643b_r.jpg&&&/figure&&p&对于并列的可选项(如激活函数、常用神经网络架构等),也会有全面的列表:&/p&&i&&figure&&img src=&https://pic4.zhimg.com/v2-f33fcb9957fade46e8c07_b.jpg& data-size=&normal& data-rawwidth=&557& data-rawheight=&460& class=&origin_image zh-lightbox-thumb& width=&557& data-original=&https://pic4.zhimg.com/v2-f33fcb9957fade46e8c07_r.jpg&&&figcaption&常用的激活函数&/figcaption&&/figure&&/i&&p&然后会有每个激活函数的单独介绍:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-c1b0370196fced7f82438_b.jpg& data-size=&normal& data-rawwidth=&971& data-rawheight=&506& class=&origin_image zh-lightbox-thumb& width=&971& data-original=&https://pic1.zhimg.com/v2-c1b0370196fced7f82438_r.jpg&&&figcaption&Sigmoid 激活函数&/figcaption&&/figure&&figure&&img src=&https://pic2.zhimg.com/v2-dfa5e8ff890885cdbc701_b.jpg& data-size=&normal& data-rawwidth=&1031& data-rawheight=&381& class=&origin_image zh-lightbox-thumb& width=&1031& data-original=&https://pic2.zhimg.com/v2-dfa5e8ff890885cdbc701_r.jpg&&&figcaption&用神经网络分类手写数字的前向传播示例(softmax 激活函数)&/figcaption&&/figure&&p&对于神经网络中较为复杂的概念(如求导、反向传播),几张图就能解释清楚:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-e0cffc46fec0b53ef67f70_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&983& data-rawheight=&302& class=&origin_image zh-lightbox-thumb& width=&983& data-original=&https://pic1.zhimg.com/v2-e0cffc46fec0b53ef67f70_r.jpg&&&/figure&&p&关于神经网络的完整训练过程,作者用简略流程图+计算细节展开的方式呈现:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-416bc68aefcce4b569190_b.jpg& data-size=&normal& data-rawwidth=&387& data-rawheight=&325& class=&content_image& width=&387&&&figcaption&反向传播算法完整流程&/figcaption&&/figure&&figure&&img src=&https://pic3.zhimg.com/v2-e5ffc211fcc26c0ca4ac6_b.jpg& data-size=&normal& data-rawwidth=&993& data-rawheight=&415& class=&origin_image zh-lightbox-thumb& width=&993& data-original=&https://pic3.zhimg.com/v2-e5ffc211fcc26c0ca4ac6_r.jpg&&&figcaption&前向传播部分的计算细节&/figcaption&&/figure&&p&就像前面提到的,这部分除了「神经网络」的介绍,还包括随机森林、梯度下降等概念的介绍,读者们可查看原教程。&/p&&p&&br&&/p&&p&&b&总结&/b&&/p&&p&看完这份教程之后,小编觉得这是一份包罗万象的学习笔记,既适合非专业人士了解有关机器学习的基础概念,又适合有专业背景的学生进一步学习。&/p&&p&写教程是为了自己持续学习,分享教程是为了帮助更多人学习。就像作者所说,「Learning by doing/teaching, 写这个教程主要是强迫自己持续学习,另外,也想分享给他人,希望能帮助到更多想学习 Machine Learning 的人,降低大家的学习痛苦。」&/p&&figure&&img src=&https://pic1.zhimg.com/v2-18cc987d5f379a82f22318_b.jpg& data-caption=&& data-size=&normal& data-rawwidth=&73& data-rawheight=&24& class=&content_image& width=&73&&&/figure&&p&教程文档下载地址(百度云):&a href=&http://link.zhihu.com/?target=https%3A//pan.baidu.com/s/1tNXYQNadAsDGfPvuuj7_Tw& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://&/span&&span class=&visible&&pan.baidu.com/s/1tNXYQN&/span&&span class=&invisible&&adAsDGfPvuuj7_Tw&/span&&span class=&ellipsis&&&/span&&/a&&/p&&p&&/p&
笔记作者:Jim Liang近日,来自SAP(全球第一大商业软件公司)的梁劲(Jim Liang)公开了自己所写的一份 520 页的学习教程(英文版),详细、明了地介绍了机器学习中的相关概念、数学知识和各种经典算法。机器之心看到后,也迫不及待的推广给更多的读者。完…
&figure&&img src=&https://pic2.zhimg.com/v2-2d11bdf016cd659aaf90dd67_b.jpg& data-rawwidth=&945& data-rawheight=&906& class=&origin_image zh-lightbox-thumb& width=&945& data-original=&https://pic2.zhimg.com/v2-2d11bdf016cd659aaf90dd67_r.jpg&&&/figure&&p&zipliner:&/p&&p&
上一篇《zipline 因子和策略开发代码集》中提到了深度学习如何在zipline里实现的问题,不少朋友感兴趣,进一步问深度学习用于量化的一系列问题。 其实深度学习我也只懂皮毛,稍微能用点罢了,详细回答真是勉为其难,真不敢系统性回答,怕误人子弟。&/p&&p& 但为了降低大家上手的学习曲线,我还是尽力把我以前做的一个例子分享给大家,这个例子较为完整的给出一个深度学习用于量化上的实践,有一定的理论和试用价值 —— 后续

我要回帖

更多关于 成份股 的文章

 

随机推荐