精华内容
下载资源
问答
  • Python numpy,数组的形状(shape属性),多维数组
    万次阅读
    2019-02-18 11:35:37

     

    demo.py(shape形状,reshape改变形状,多维数组):

    # coding=utf-8
    import numpy as np
    
    
    # shape属性(形状)
    t1 = np.array([1, 2, 3, 4, 5])  # 一维数组
    print(t1.shape)   # (5,)  5个元素
    
    
    t2 = np.array([[1, 2, 3], [4, 5, 6]])  # 二维数组
    print(t2.shape)   # (2, 3)  2行3列
    
    
    # reshape改变数组的形状
    t3 = np.arange(12)
    t4 = t3.reshape((3, 4))   # 改变形状,改成3行4列
    print(t4)
    '''
    [[ 0  1  2  3]
     [ 4  5  6  7]
     [ 8  9 10 11]]
    '''
    
    
    t5 = t4.reshape((t4.shape[0] * t4.shape[1],))  # 将多维数组转成一维数组(复杂方法)
    print(t5)  # [ 0  1  2  3  4  5  6  7  8  9 10 11]
    
    t6 = t4.flatten()   # 将多维数组转成一维数组(简单方法)
    print(t6)  # [ 0  1  2  3  4  5  6  7  8  9 10 11]
    

     

     

    更多相关内容
  • 思维模型 五行

    千次阅读 2020-06-03 18:34:36
    背景知识:在讲这些个故事前,我们要知道 五行的相生相克关系以及 五行与 我们年龄段、男女的关系。五行生克图如下: 五行与年纪的关系如下: 五行与婚姻阶段(该部分主要描述 大的 婚姻阶段): 少男少女:...

    本系列文章 主要是 分享 思维模型,涉及各个领域,重在提升认知


    1 模型故事

    背景知识:在讲这些个故事前,我们要知道 五行的相生相克关系以及 五行与 我们年龄段、男女的关系。五行生克图如下:

    五行与年纪的关系如下:

    五行与婚姻阶段(该部分主要描述 大的 婚姻阶段):

    1. 少男少女:这是在 恋爱和婚姻开始的阶段,小男孩儿追 小女孩儿 叫做 土生金,这时候 是和谐、开心的。
    2. 中男中女:结婚几年后 遇到 七年之痒,结婚大概七八年时就没有激情了,麻木了,我拉着你的手,就像左手拉右手,我摸你的腿,就像摸自己的大腿一样了,婚姻到了那个阶段,变成了 中年男女啊,从土生金变成了水克火。中男属水而中女属火,婚姻在这个时候走到了水火不容水客户的阶段了,而这也是离婚率最高的时候,而且大量的这个年龄段儿的男人伤这个年龄段的女人的心,并且婚姻这时一旦破裂,受伤的往往是女性,因为水克火。
    3. 长男长女:当然如果再发展几年,熬过去,婚姻发展到 四十多岁五十岁以后就到了下一个阶段,长男长女 五行均属木。木和木自己的关系是比和。所以这时候呢相对又和谐了,这种和谐,虽然没有相生和相克,没那么有激情,但是就习惯了,所以人一过 四五十多岁,离婚率反而下降了,因为到了木木比合的阶段,但三十来岁的人就不凑合,非常容易擦枪走火。
    4. 老男老女:再到老爷爷老奶奶。老男属金,老女属土,又返回到了 土生金的阶段,但是颠倒过来了,男女之间的关系是不一样的,年轻时 是土生金 是少男生少女。老了就变成了老女 生 老男。我们可以看到大街上一般老太太 寿命高,在大街上往往是老奶奶手搀扶着那个老头儿照顾那个老头儿,所以叫土生金。

    我们的婚姻就是从土生金到水火相克,到木木比和 相互习惯,再到反过来的土生金 这样的一个过程。所以说 五行 这个学问特别重要,如果你了解,就知道在当下这个年龄段儿我们该做什么,每个年龄段我们应该注意什么而不是过了这个年龄段儿回过去后悔。所以五行 距离 我们的生活一点都不远,而且很近。你认为很多莫名其妙不可理解,找不到原因是完全可以找到原因,在三千多年前中国的老祖宗就给他定位好了。

    五行色彩 与招牌/标志/建筑(仅从五行色彩角度看影响):

    背景知识:金-白色,木-青色,水-黑色,火-红色,土-黄色。对于招牌而言 底色为客,字号和商标为主,因此一个招牌如果“客色生主色”或“主色克客色”则吉,反之“客色克主色”或“主色生客色”(即 “客色泄主色”)则凶。

    我们先来看 中国农业银行:

    中国农业银行招牌的底色为白色,属金,文字为黑色属水,LOGO为绿色属于木,这里 金为“客色”,水和木为主色(其中字号黑色的面积比较大,所以主色以水为主)。所谓“金生水”,农业银行这个招牌“客色”生“主色”。而字号(黑色属水)又生商标(绿色属木),“金生水”、“水生木”形成一个循环相生的能量。虽然底色白色对logo颜色相克,但是由于LOGO面积相对文字部分较小,所以农业银行这个招牌总体属于吉利的。

    接下来我们再来看看 邮政银行:

    中国邮政储蓄银行的招牌中,底色为绿色属于“木”,字号和logo为黄色属“土”,所谓“木克土”,也就是 “客色克主色”,总体上讲对组织的发展并不有利,至于邮政储蓄银行的业务,我们都清楚的。

    接下来我们看看 纳粹的旗帜(左边是纳粹,右边是佛教万字符):

    纳粹的标志“卐”,也体现五行生克的道理:它被设计成与佛家“卍”的印记(“卍”是上古时代许多部落的一种符咒,在古代印度、波斯、希腊、埃及、特洛伊等国的历史上均有出现,后来被古代的一些宗教所沿用。最初人们把它看成是太阳或火的象征,以后普遍被作为吉祥的标志。随着古代印度佛教的传播,“卍”字也传入中国。)正好相反的形状,而颜色则为红、白、黑三色。五行原理气机驳杂、乱冲乱克的矛盾体,五行之火(红色)克五行之金(白色),而五行之水(黑色)又克五行之火(红色)。纳粹党逆行天下,虽没有名垂千古的功效,但可以有遗臭万年的威力。

    接下来我们看看 五行色彩在建筑方面的应用:

    故宫紫禁城的五行色彩搭配,就绝妙地体现了五行相生的原则,紫禁城的城墙是红色的,而上面的琉璃瓦及故宫众多殿宇的金顶为黄色,体现了五行中火(红色)土(黄色)相生的原理。历经数百年沧桑,紫禁城在今日更显其独步天下的王者风范。

    五行与身体健康(各种失衡与 对策):

    • 金 在人体失衡时,呼吸系统机能比较弱,千万不要抽烟,要维持正常作息,早睡早起,才可以保护先天比较弱的呼吸系统。偏好吃重口味,辣口味的东西,像是麻辣火锅,四川菜,应该都符合您的口味。此时我们要做好饮食均衡,菜色均衡,则阴阳五行调和。
    • 木 在人体失衡时,肝胆机能比较弱,容易肝火旺盛,甚至容易导致免疫功能衰退、肝功能异常、脂肪肝、肝硬化、青光眼、白内障或视力病变等问题。此时我们要尽量不喝酒,维持正常作息,偏好吃酸的东西,像是酸辣汤等,应该都符合口味。
    • 水 在人体失衡时,体质比较寒冷,容易手脚冰冷,肾水系统比较差,无法从事需要大量劳力的工作,容易有血压、贫血、心脏的问题,进而容易导致失眠、忧郁、脑神经衰弱、听力异常。。。此时我们要调理饮食,尤其重口味的食物吃多了会伤肾,调理食物的方式也要由多油炒改为多蒸煮,减少盐分和油脂的摄取量。
    • 火 在人体失衡时,心血管机能比较弱,容易有高血压,高血脂,心跳的问题。容易导致心血管功能异常、内分泌系统异常、肠阻塞胀气、心律不整、心室肥大、脑溢血、中风、视力病变等问题。此时我们不能过度劳累,要维持正常作息,尽量不要喝冰的饮料,以免伤了元气。
    • 土 在人体失衡时,胃肠机能比较弱,容易有腹胀,腹痛,腹泻,消化吸收的问题。此时我们要早睡早起,三餐要定时定量,少吃刺激性饮食,偏好吃各种甜食或甜点,因您的细胞中,充满太多活太少的土五行。

    2 模型 五行

    五行是中国古代哲学的一种系统观,广泛用于中医堪舆(风水)、命理相术占卜等方面。五行的意义包涵借着阴阳演变过程的五种基本动态:(代表浸润)、(代表破灭)、(代表敛聚聚)、(代表生长)、(代表融合)。中国古代哲学家用五行理论来说明世界万物的形成及其相互关系。它强调整体,旨在描述事物的运动形式以及转化关系。阴阳是古代的对立统一学说,五行是原始的系统论。

    道家五行学说最早,旨在描述事物的运动形式以及转化关系。五行学说是我国古代的取象比类学说,不是五种元素,而是将万事万物按照润下、炎上、曲直、从革、稼穑的性质归属到水火木金土五个项目中,与西方古代的地、水、火、风四元素学说有区别,是集哲学、占卜、算命、历法、中医学、社会学等诸多学于一身的理论。

    五行系指古人把宇宙万物划分为五种性质的事物,也即分成木、火、土、金、水五大类,并叫它们为“五行”。早见《尚书·洪范》记载:“五行:一曰水,二曰火,三曰木,四曰金,五曰土。水曰润下(滋润),火曰炎上(燃烧),木曰曲直(弯曲,舒张),金曰从革(成分致密,善分割),土爰稼穑(意指播种收获)。润下作咸,炎上作苦,曲直作酸,从革作辛,稼穑作甘。”这里不但将宇宙万物进行了分类,而且对每类的性质与特征都做了界定。

    后人根据对五行的认识,又创造了五行相生相克理论:

    1. 相生,是指两类属性不同的事物之间存在相互帮助,相互促进的关系;具体是:木生火,火生土,土生金,金生水,水生木。
    2. 相克,则与相生相反,是指两类不同五行属性事物之间关系是相互克制的;具体是:木克土,土克水,水克火、火克金、金克木。

    五行学说采用取象比类的方法,将世上万事万物朴素地分为五类,在五行属性的基础上,运用生克制化的关系,来说明和解释事物之间的相互联系和变化。像阴阳一样,五行之间存在着相生相克的规律。相生相克是任何事物不可分割的两个方面。没有相生,就没有任何事物的发生发展,没有相克,就没有事物发生发展中的协调和平衡。相生保证了事物发展的原动力和可能性,相克保证了事物发展的控制力和协调性。事物之间这种生中有克,克中有生,相辅相成,互相为用的关系,推动和维持事物的不断生长、变化和发展。《类经图翼》曰:“盖造化之机,不可无生,亦不可无制。无生则发育无由,无制则亢而为害。生克循环,运行不息,而天地之道,斯无穷已。”

    运用五行的各种特性,以木火土金水为中心,凡自然界中的各种现象、特征、形态、功能、表现等诸方面和五行中某一行的特性相类似,就 把它归纳于哪一行中,分成五类,在五行属性的基础上分门别类作系统归纳,将各种纷繁复杂的现象理出五行规律,从而可以说明各类之间的联系及变化关系。

    3 模型简图

     

    展开全文
  • 用css绘制各种形状

    千次阅读 2021-06-11 01:24:37
    原标题:用css绘制各种形状自适应的椭圆1.自适应的椭圆实现方式是通过border-radius这个属性;border-radius它可以单独指定水平和垂直半径。用 / 分隔这两个值。并且该属性的值不仅可以接受长度值,还能接收百分比的...

    原标题:用css绘制各种形状

    自适应的椭圆

    1.自适应的椭圆

    实现方式是通过border-radius这个属性;border-radius它可以单独指定水平和垂直半径。用 / 分隔这两个值。并且该属性的值不仅可以接受长度值,还能接收百分比的值。百分比的值会基于元素的尺寸进行解析,宽是水平半径的解析,高是垂直半径的解析。

    所以可以把两个半径的值都设置成50%;

    border-radius: 50% / 50%; /* 值都是50% 就可以简化成 border-radius: 50%; */

    最终的效果:

    16046481e24214b3b2cef545d635e26b.png

    2.半椭圆的实现

    border-radius的值是可以分开设置的,用空格进行分开,甚至可以为四个角提供完全不同的水平和垂直的半径。

    border-radius四个值的渲染顺序是从左上角开始,顺时针渲染;

    当只给定3个值时,第四个值和第二个相等;

    当给定两个值时,第三个值和第一个值相等,第四个值和第二个值相等。

    所以半椭圆的实现方法就是:

    border-radius: 50% / 100% 100% 0 0; /* * 会解析成下面的样子 border-top-left-radius: 50% 100%; border-top-right-radius: 50% 100%; border-bottom-right-radius: 50% 0px; border-bottom-left-radius: 50% 0px;*/

    最终效果:

    68041f31c38761455b0f013fd66def6b.png

    同理的四分之的椭圆的生成方法:

    /* 不能设置圆角的就设置成 0 */border-radius: 100% 0 0 0;

    最终效果:

    b8d7828ba9c0d8ae6c0cce58a44461f3.png

    平行四边形的实现

    在生成平行四边形时,直接对当前对div使用transform: skew(-45deg);变形,会导致div里面的内容也会发生变形,就像下面这样:

    f5f5dc62820cc173738fff57bab26f75.png

    通用的解决办法是通过伪元素的方法,就是把所有的样式用到伪元素上,对伪元素进行变形,由于内容不在伪元素里,所以内容不会受到影响。具体的实现如下:

    click
    .parallelogram { text-align: center; position: relative;}.parallelogram::before { transform: skew(-45deg); position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -1; content: ' '; background: #fb3;}

    生成的效果如下:

    b9453f98fdb654eb71d5796e6ca0212b.png

    这种技巧不仅对于skew()变形来说有用,还适用于其他任何变形样式,当想变形任何一个元素而不想改变它的内容的时候都可以用到它。

    菱形图片的生成

    在css中,有些需求是要把图片裁剪成菱形,使用css可以很好的解决这个问题,为不需要预先把图片裁剪成菱形而影响后期的维护。

    基于变形的方案

    直接使用类似平行四边形的方式旋转,给img设置max-width: 100%,会导致图片被裁剪成八边形。因为100%会被解析成div的边长。所以解决这个问题的办法就是让图片的宽等于div这个容器的对角线的长度,比较好的办法就是把图片用scale放大根号2倍(大概是1.42倍),具体实现的代码如下:

    cat.jpg
    .picture { width: 400px; height: 400px; transform: rotate(45deg); overflow: hidden;}.picture1 > img { max-width: 100%; height: 400px; transform: rotate(-45deg) scale(1.42);}

    效果如下:

    0b565b060b115903bc7cadae667ea469.png

    scale和width放大的区别:

    scale的缩放图片是以它的中心点进行缩放的(在不指定transform-origin的前提下),通过width属性来放大图片时,只会以它左上角的原点进行缩放,然后用额外的负边距来调整图片的位置。

    裁切路径方案

    上面的办法还需要前套一层多余的html标签,使用clip-path这个属性,这个原本是svg的属性,使用polygon()这个多边形的函数,使用的百分比的值会解析为元素自身的尺寸。

    img { clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%);}

    clip-path这个属性还能参与动画,只要动画是在同一个形状函数之间进行的,而且点的数量是相同的就可以,比如我们希望鼠标hover时平滑的扩展为完成的面积,只需这样:

    .picture { clip-path: polygon(50% 0, 100% 50%, 50% 100%, 0 50%); transition: 1s clip-path;}.picture:hover { clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);}切脚效果的实现

    径向渐变的方式

    实现一个角被切掉的效果,可以使用渐变,渐变接受一个角度作为方向,并且允许文字溢出并超出切角区域(因为它只是背景图案),具体实现如下:

    div { background: #58a; background: linear-gradient(-45deg, transparent 15px, #58a 0);}

    效果如下:

    44b6b06837681ca936c78335d06208fe.png

    实现两个切角的办法:

    div { width: 200px; height: 100px; background: #58a; background: linear-gradient(-45deg, transparent 15px, #58a 0) right, linear-gradient(45deg, transparent 15px, #65a 0) left; background-size: 50% 100%; background-repeat: no-repeat;}

    效果如下:

    d24b447d4fabb949e30164d96acb42a8.png

    同理的四个切角的实现:

    div { width: 200px; height: 100px; background: #58a; background: linear-gradient(135deg, transparent 15px, #58a 0) top left, linear-gradient(-135deg, transparent 15px, #58a 0) top right, linear-gradient(-45deg, transparent 15px, #58a 0) bottom right, linear-gradient(45deg, transparent 15px, #58a 0) bottom left; background-size: 50% 50%; background-repeat: no-repeat;}

    效果如下:

    e21e52740bee867a3eae183dc7d79722.png

    上面的代码可维护比较差,在改变切角和颜色时都要修改多处,所以我们可以使用scss的mixin来写:

    @mixin beveled-corners($bg, $tl:0, $tr:$tl, $br:$tl, $bl:$tr) { background: $bg; background: linear-gradient(135deg, transparent $tl, $bg 0) top left, linear-gradient(225deg, transparent $tr, $bg 0) top right, linear-gradient(-45deg, transparent $br, $bg 0) bottom right, linear-gradient(45deg, transparent $bl, $bg 0) bottom left; background-size: 50% 50%; background-repeat: no-repeat;}

    调用时:

    @include beveled-corners(#58a, 15px, 5px);

    最后生成的效果是左上角和右下角是15px的切角,右上角和左下角是5px的切角。上面的minxin设置了初值,当传入的值少于四个值时,就跟border-radius赋值一样。

    一样的道理我们也可以创建弧形切角,至少改成径向渐变

    div { width: 200px; height: 100px; background: #58a; background: radial-gradient(circle at top left, transparent 15px, #58a 0) top left, radial-gradient(circle at top right, transparent 15px, #58a 0) top right, radial-gradient(circle at bottom right, transparent 15px, #58a 0) bottom right, radial-gradient(circle at bottom left, transparent 15px, #58a 0) bottom left; background-size: 50% 50%; background-repeat: no-repeat;}

    效果如下:

    dad2a36efc5d9aa8f40f765f87229c30.png

    内联SVG与border-image的方式

    SVG 可以实现与尺寸完全无关的完美缩放,当文本溢出的时候,则会起到普通边框的作用,令文字折行。具体的实现如下:

    div { width: 200px; height: 100px; border: 15px solid transparent; border-image: 1 url('data:image/svg+xml,');}

    效果如下:

    044676991b055e6deb8f961b4a4fe6f9.png

    解决中间的背景色的填充可以给div块加一个和border一样的背景色:

    div { width: 200px; height: 100px; border: 15px solid transparent; border-image: 1 url(data:image/svg+xml,); background: #58a; background-clip: padding-box;}

    裁切路径方案

    CSS 裁切路径最神奇的地方在于我们可以同时使用百分比数值(它会以元素自身的宽高作为基数度进行换算)和绝对长度值,从而提供巨大的灵活性。

    如果用裁切路径将一个元素切出20px大小的斜面切角,具体的代码如下:

    background: #58a;clip-path: polygon( 20px 0, calc(100% - 20px) 0, 100% 20px, 100% calc(100% - 20px), calc(100% - 20px) 100%, 20px 100%, 0 calc(100% - 20px), 0 20px);

    这个方法最大的好处:可以使用任意类型的背景,甚至可以对替换元素(比如图片)进行裁切,并且支持动画效果。

    缺点:当内边距不够宽时,它会裁切掉文本。

    梯形标签页的实现

    梯形的实现可以通过

    div { position: relative; display: inline-block; padding: .5em 1em .35em; color: white;}div::before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: -1; background: #58a; transform: scaleY(1.3) perspective(.5em) rotateX(5deg); transform-origin: bottom;}

    效果如下:

    0d798e60fe8b1d764484d6ea501d09b9.png

    变形效果会让这个元素以它自身的中心线为轴进行空间上的旋转,这会让它的尺寸很难控制,解决办法可以设置transform-origin:bottom;,当它在3D空间中旋转时,把它的底边固定。固定底边的同时,高度的缩水会变得更加显眼。为了解决这个问题,可以通过变形属性(scaleY())来改变它的尺寸。

    同样的方法可以实现下面这种tab布局:

    具体代码如下:

    nav > a { position: relative; display: inline-block; padding: .3em 1em 0;}nav > a::before { content: ''; position: absolute; top: 0; right: 0; bottom: 0; left: 0; z-index: -1; background: #ccc; background-image: linear-gradient(hsla(0,0%,100%,.6), hsla(0,0%,100%,0)); border: 1px solid rgba(0,0,0,.4); border-bottom: none; border-radius: .5em .5em 0 0; box-shadow: 0 .15em white inset; transform: perspective(.5em) rotateX(5deg); transform-origin: bottom;}

    通过把transform-origin改成bottom left或bottom right,就可以立即得到左侧倾斜或右侧倾斜的标签页。

    这个方法的缺点是:斜边的角度依赖于元素的宽度。不过,对于宽度变化不大的多个元素(比如导航菜单)来说,这个方法还是非常管用的。

    简单的饼图的绘制

    思路是把圆形的左右两部分指定为上述两种颜色,然后用伪元素覆盖上去,通过旋转来决定露出多大的扇区。

    具体的代码如下:

    .pie { width: 100px; height: 100px; border-radius: 50%; background: yellowgreen; background-image: linear-gradient(to right, transparent 50%, #655 0); .pie::before { content: ''; display: block; margin-left: 50%; height: 100%; border-radius: 0 100% 100% 0 / 50%; background-color: inherit; transform-origin: left;}

    实现的效果如下:

    27d78e9960ee620536e363e3e7f2e501.png

    这种方式还支持动画,就可以用CSS动画来实现一个饼图从0 变化到100% 的动画,从而得到一个炫酷的进度指示器:

    @keyframes spin { to { transform: rotate(.5turn); }}@keyframes bg { 50% { background: #655; }}.pie::before { content: ''; display: block; margin-left: 50%; height: 100%; border-radius: 0 100% 100% 0 / 50%; background-color: inherit; transform-origin: left; animation: spin 3s linear infinite, bg 6s step-end infinite;}

    生成多个不同比率的静态饼图的办法,可以通过上面的那个动画的实现,需要设置动画处于暂停状态,然后设置负的动画延时直接跳转到动画中的任意时间点, 最终实现的代码如下:

    20
    60
    .pie{ position: relative; width: 100px; height: 100px; line-height: 100px; border-radius: 50%; background: yellowgreen; background-image: linear-gradient(to right, transparent 50%, #655 0); color: #000; text-align: center;}@keyframes spin { to { transform: rotate(.5turn); }}@keyframes bg { 50% { background: #655; }}.pie::before { content: ''; position: absolute; top: 0; left: 50%; width: 50%; height: 100%; border-radius: 0 100% 100% 0 / 50%; background-color: inherit; transform-origin: left; animation: spin 50s linear infinite, bg 100s step-end infinite; animation-play-state: paused; animation-delay: inherit;}.pie span { position: relative; z-index: 10;}

    效果如下:

    a3a011834c61cb713a527c651848c0ec.png

    用SVG 解决方案svg { width: 100px; height: 100px; transform: rotate(-90deg); background: yellowgreen; border-radius: 50%;}circle { fill: yellowgreen; stroke: #655; stroke-width: 32; stroke-dasharray: 38 100; /* 可得到比率为38%的扇区 */}

    让饼图的周长无限接近100,就可以直接把比率的百分比值指定为strokedasharray的长度,不需要做任何计算了。因为周长是2πr,半径就是100/22π ≈ 15.915,最终把这个值取整为16。在SVG的viewBox属性中指定其尺寸,而不再使用width和height属性,这样就可以让它自动适应容器的大小了。

    SVG的优点是增加第三种颜色是非常容易的,并且可以用内联样式来指定颜色。

    via:https://segmentfault.com/a/1190000009206542返回搜狐,查看更多

    责任编辑:

    展开全文
  • 本文实现两个案例,分别是:鸢尾花数据分类 和 鸢尾花数据特征属性比较。

    本文实现两个案例,分别是:鸢尾花数据分类 和 鸢尾花数据特征属性比较。

    用到的数据集跟前面博客中KNN中的数据集是一样:
    数据链接:https://download.csdn.net/download/zhanglianhai555/12340138

    1.鸢尾花数据分类

    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib as mpl
    import warnings
    
    from sklearn import tree #决策树
    from sklearn.tree import DecisionTreeClassifier #分类树
    from sklearn.model_selection  import train_test_split#测试集和训练集
    from sklearn.pipeline import Pipeline #管道
    from sklearn.feature_selection import SelectKBest #特征选择
    from sklearn.feature_selection import chi2 #卡方统计量
    
    from sklearn.preprocessing import MinMaxScaler  #数据归一化
    from sklearn.decomposition import PCA #主成分分析
    from sklearn.model_selection import GridSearchCV #网格搜索交叉验证,用于选择最优的参数
    
    ## 设置属性防止中文乱码
    mpl.rcParams['font.sans-serif'] = [u'SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    
    warnings.filterwarnings('ignore', category=FutureWarning)
    
    iris_feature_E = 'sepal length', 'sepal width', 'petal length', 'petal width'
    iris_feature_C = '花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度'
    iris_class = 'Iris-setosa', 'Iris-versicolor', 'Iris-virginica'
    
    #读取数据
    path = './datas/iris.data'  
    data = pd.read_csv(path, header=None)
    x=data[list(range(4))]#获取X变量
    y=pd.Categorical(data[4]).codes#把Y转换成分类型的0,1,2
    print("总样本数目:%d;特征属性数目:%d" % x.shape)
    

    总样本数目:150;特征属性数目:4

    x.head(1)
    

    在这里插入图片描述

    y
    

    在这里插入图片描述

    data.head(5)
    

    在这里插入图片描述

    #数据进行分割(训练数据和测试数据)
    x_train1, x_test1, y_train1, y_test1 = train_test_split(x, y, train_size=0.8, random_state=14)
    
    x_train, x_test, y_train, y_test = x_train1, x_test1, y_train1, y_test1
    print ("训练数据集样本数目:%d, 测试数据集样本数目:%d" % (x_train.shape[0], x_test.shape[0]))
    ## 因为需要体现以下是分类模型,因为DecisionTreeClassifier是分类算法,要求y必须是int类型
    y_train = y_train.astype(np.int)
    y_test = y_test.astype(np.int)
    

    训练数据集样本数目:120, 测试数据集样本数目:30

    y_train
    

    在这里插入图片描述

    #数据标准化
    #StandardScaler (基于特征矩阵的列,将属性值转换至服从正态分布)
    #标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,将样本的特征值转换到同一量纲下
    #常用与基于正态分布的算法,比如回归
    
    #数据归一化
    #MinMaxScaler (区间缩放,基于最大最小值,将数据转换到0,1区间上的)
    #提升模型收敛速度,提升模型精度
    #常见用于神经网络
    
    #Normalizer (基于矩阵的行,将样本向量转换为单位向量)
    #其目的在于样本向量在点乘运算或其他核函数计算相似性时,拥有统一的标准
    #常见用于文本分类和聚类、logistic回归中也会使用,有效防止过拟合
    
    ss = MinMaxScaler()
    #用标准化方法对数据进行处理并转换
    ## scikit learn中模型API说明:
    ### fit: 模型训练;基于给定的训练集(X,Y)训练出一个模型;该API是没有返回值;eg: ss.fit(X_train, Y_train)执行后ss这个模型对象就训练好了
    ### transform:数据转换;使用训练好的模型对给定的数据集(X)进行转换操作;一般如果训练集进行转换操作,那么测试集也需要转换操作;这个API只在特征工程过程中出现
    ### predict: 数据转换/数据预测;功能和transform一样,都是对给定的数据集X进行转换操作,只是transform中返回的是一个新的X, 而predict返回的是预测值Y;这个API只在算法模型中出现
    ### fit_transform: fit+transform两个API的合并,表示先根据给定的数据训练模型(fit),然后使用训练好的模型对给定的数据进行转换操作
    x_train = ss.fit_transform(x_train)
    x_test = ss.transform(x_test)
    print ("原始数据各个特征属性的调整最小值:",ss.min_)
    print ("原始数据各个特征属性的缩放数据值:",ss.scale_)
    

    原始数据各个特征属性的调整最小值: [-1.19444444 -0.83333333 -0.18965517 -0.04166667]
    原始数据各个特征属性的缩放数据值: [0.27777778 0.41666667 0.17241379 0.41666667]

    #特征选择:从已有的特征中选择出影响目标值最大的特征属性
    #常用方法:{ 分类:F统计量、卡方系数,互信息mutual_info_classif
            #{ 连续:皮尔逊相关系数 F统计量 互信息mutual_info_classif
    #SelectKBest(卡方系数)
    
    #在当前的案例中,使用SelectKBest这个方法从4个原始的特征属性,选择出来3个
    ch2 = SelectKBest(chi2,k=3)
    #K默认为10
    #如果指定了,那么就会返回你所想要的特征的个数
    x_train = ch2.fit_transform(x_train, y_train)#训练并转换
    x_test = ch2.transform(x_test)#转换
    
    select_name_index = ch2.get_support(indices=True)
    print ("对类别判断影响最大的三个特征属性分布是:",ch2.get_support(indices=False))
    print(select_name_index)
    

    对类别判断影响最大的三个特征属性分布是: [ True False True True]
    [0 2 3]

    #降维:对于数据而言,如果特征属性比较多,在构建过程中,会比较复杂,这个时候考虑将多维(高维)映射到低维的数据
    #常用的方法:
    #PCA:主成分分析(无监督)
    #LDA:线性判别分析(有监督)类内方差最小,人脸识别,通常先做一次pca
    
    pca = PCA(n_components=2)#构建一个pca对象,设置最终维度是2维
    # #这里是为了后面画图方便,所以将数据维度设置了2维,一般用默认不设置参数就可以
    
    x_train = pca.fit_transform(x_train)#训练并转换
    x_test = pca.transform(x_test)#转换
    
    #模型的构建
    model = DecisionTreeClassifier(criterion='entropy',random_state=0)#另外也可选gini 
    #模型训练
    model.fit(x_train, y_train)
    #模型预测
    y_test_hat = model.predict(x_test) 
    
    #模型结果的评估
    y_test2 = y_test.reshape(-1)
    result = (y_test2 == y_test_hat)
    print ("准确率:%.2f%%" % (np.mean(result) * 100))
    #实际可通过参数获取
    print ("Score:", model.score(x_test, y_test))#准确率
    print ("Classes:", model.classes_)
    print("获取各个特征的权重:", end='')
    print(model.feature_importances_)
    

    准确率:96.67%
    Score: 0.9666666666666667
    Classes: [0 1 2]
    获取各个特征的权重:[0.93420127 0.06579873]

    N = 100  #横纵各采样多少个值
    x1_min = np.min((x_train.T[0].min(), x_test.T[0].min()))
    x1_max = np.max((x_train.T[0].max(), x_test.T[0].max()))
    x2_min = np.min((x_train.T[1].min(), x_test.T[1].min()))
    x2_max = np.max((x_train.T[1].max(), x_test.T[1].max()))
    
    t1 = np.linspace(x1_min, x1_max, N)
    t2 = np.linspace(x2_min, x2_max, N)
    x1, x2 = np.meshgrid(t1, t2)  # 生成网格采样点
    x_show = np.dstack((x1.flat, x2.flat))[0] #测试点
    
    y_show_hat = model.predict(x_show) #预测值
    
    y_show_hat = y_show_hat.reshape(x1.shape)  #使之与输入的形状相同
    print(y_show_hat.shape)
    y_show_hat[0]
    

    在这里插入图片描述

    #画图
    plt_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
    plt_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
    
    plt.figure(facecolor='w')
    ## 画一个区域图
    plt.pcolormesh(x1, x2, y_show_hat, cmap=plt_light) 
    # 画测试数据的点信息
    plt.scatter(x_test.T[0], x_test.T[1], c=y_test.ravel(), edgecolors='k', s=150, zorder=10, cmap=plt_dark, marker='*')  # 测试数据
    # 画训练数据的点信息
    plt.scatter(x_train.T[0], x_train.T[1], c=y_train.ravel(), edgecolors='k', s=40, cmap=plt_dark)  # 全部数据
    plt.xlabel(u'特征属性1', fontsize=15)
    plt.ylabel(u'特征属性2', fontsize=15)
    plt.xlim(x1_min, x1_max)
    plt.ylim(x2_min, x2_max)
    plt.grid(True)
    plt.title(u'鸢尾花数据的决策树分类', fontsize=18)
    plt.show()
    

    在这里插入图片描述

    #参数优化
    pipe = Pipeline([
                ('mms', MinMaxScaler()),
                ('skb', SelectKBest(chi2)),
                ('pca', PCA()),
                ('decision', DecisionTreeClassifier(random_state=0))
            ])
    
    # 参数
    parameters = {
        "skb__k": [1,2,3,4],
        "pca__n_components": [0.5,0.99],#设置为浮点数代表主成分方差所占最小比例的阈值,这里不建议设置为数值,思考一下?
        "decision__criterion": ["gini", "entropy"],
        "decision__max_depth": [1,2,3,4,5,6,7,8,9,10]
    }
    #数据
    x_train2, x_test2, y_train2, y_test2 = x_train1, x_test1, y_train1, y_test1
    #模型构建:通过网格交叉验证,寻找最优参数列表, param_grid可选参数列表,cv:进行几折交叉验证
    gscv = GridSearchCV(pipe, param_grid=parameters,cv=3)
    #模型训练
    gscv.fit(x_train2, y_train2)
    #算法的最优解
    print("最优参数列表:", gscv.best_params_)
    print("score值:",gscv.best_score_)
    print("最优模型:", end='')
    print(gscv.best_estimator_)
    #预测值
    y_test_hat2 = gscv.predict(x_test2)
    

    最优参数列表: {‘decision__criterion’: ‘gini’, ‘decision__max_depth’: 4, ‘pca__n_components’: 0.99, ‘skb__k’: 3}
    score值: 0.95
    最优模型:Pipeline(steps=[(‘mms’, MinMaxScaler(copy=True, feature_range=(0, 1))), (‘skb’, SelectKBest(k=3, score_func=<function chi2 at 0x000000073911B9D8>)), (‘pca’, PCA(copy=True, iterated_power=‘auto’, n_components=0.99, random_state=None,
    svd_solver=‘auto’, tol=0.0, whiten=False)), (‘decision’, DecisionTreeClass…split=2, min_weight_fraction_leaf=0.0,
    presort=False, random_state=0, splitter=‘best’))])

    #应用最优参数看效果
    mms_best = MinMaxScaler()
    skb_best = SelectKBest(chi2, k=3)
    pca_best = PCA(n_components=0.99)
    decision3 = DecisionTreeClassifier(criterion='gini', max_depth=4)
    #构建模型并训练模型
    x_train3, x_test3, y_train3, y_test3 = x_train1, x_test1, y_train1, y_test1
    x_train3 = pca_best.fit_transform(skb_best.fit_transform(mms_best.fit_transform(x_train3), y_train3))
    x_test3 = pca_best.transform(skb_best.transform(mms_best.transform(x_test3)))
    decision3.fit(x_train3, y_train3)
    
    print("正确率:", decision3.score(x_test3, y_test3))
    

    正确率: 0.9666666666666667

    #基于原始数据前3列比较一下决策树在不同深度的情况下错误率
    ### TODO: 将模型在训练集上的错误率也画在图中
    x_train4, x_test4, y_train4, y_test4 = train_test_split(x.iloc[:, :2], y, train_size=0.7, random_state=14)
    
    depths = np.arange(1, 15)
    err_list = []
    for d in depths:
        clf = DecisionTreeClassifier(criterion='entropy', max_depth=d, min_samples_split=10)#仅设置了这二个参数,没有对数据进行特征选择和降维,所以跟前面得到的结果不同
        clf.fit(x_train4, y_train4)
        
        ## 计算的是在训练集上的模型预测能力
        score = clf.score(x_test4, y_test4)
        err = 1 - score
        err_list.append(err)
        print("%d深度,测试集上正确率%.5f" % (d, clf.score(x_train4, y_train4)))
        print("%d深度,训练集上正确率%.5f\n" % (d, score))
    
    ## 画图
    plt.figure(facecolor='w')
    plt.plot(depths, err_list, 'ro-', lw=3)
    plt.xlabel(u'决策树深度', fontsize=16)
    plt.ylabel(u'错误率', fontsize=16)
    plt.grid(True)
    plt.title(u'决策树层次太多导致的拟合问题(欠拟合和过拟合)', fontsize=18)
    plt.show()
    

    1深度,测试集上正确率0.66667
    1深度,训练集上正确率0.57778
    2深度,测试集上正确率0.71429
    2深度,训练集上正确率0.71111
    3深度,测试集上正确率0.80000
    3深度,训练集上正确率0.75556
    4深度,测试集上正确率0.81905
    4深度,训练集上正确率0.75556
    5深度,测试集上正确率0.81905
    5深度,训练集上正确率0.71111
    6深度,测试集上正确率0.85714
    6深度,训练集上正确率0.66667
    7深度,测试集上正确率0.85714
    7深度,训练集上正确率0.66667
    8深度,测试集上正确率0.85714
    8深度,训练集上正确率0.66667
    9深度,测试集上正确率0.86667
    9深度,训练集上正确率0.71111
    10深度,测试集上正确率0.86667
    10深度,训练集上正确率0.71111
    11深度,测试集上正确率0.87619
    11深度,训练集上正确率0.66667
    12深度,测试集上正确率0.86667
    12深度,训练集上正确率0.71111
    13深度,测试集上正确率0.86667
    13深度,训练集上正确率0.71111
    14深度,测试集上正确率0.86667
    14深度,训练集上正确率0.71111

    在这里插入图片描述

    2. 鸢尾花数据特征属性比较

    import numpy as np
    import pandas as pd
    import matplotlib as mpl
    import matplotlib.pyplot as plt
    from sklearn.tree import DecisionTreeClassifier
    
    mpl.rcParams['font.sans-serif'] = [u'SimHei']
    mpl.rcParams['axes.unicode_minus'] = False
    
    iris_feature = u'花萼长度', u'花萼宽度', u'花瓣长度', u'花瓣宽度'
    path = 'datas/iris.data'  # 数据文件路径
    data = pd.read_csv(path, header=None)
    x_prime = data[list(range(4))]
    y = pd.Categorical(data[4]).codes
    
    #进行特征比较
    feature_pairs = [[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
    plt.figure(figsize=(9, 6), facecolor='w')
    for i, pair in enumerate(feature_pairs):
    #获取数据
        x = x_prime[pair]
    #决策树学习
        clf = DecisionTreeClassifier(criterion='gini', max_depth=5)
        clf.fit(x, y)
        
        y_hat = clf.predict(x)
        score = clf.score(x, y)
        y2 = y.reshape(-1)
        c = np.count_nonzero(y_hat == y)   #统计预测正确的个数
        print ('特征:  ', iris_feature[pair[0]], ' + ', iris_feature[pair[1]])
        print ('\t预测正确数目:', c)
        print ('\t准确率: %.2f%%' % (score*100))
    
        N, M = 500, 500  # 横纵各采样多少个值
        x1_min, x2_min = x.min()
        x1_max, x2_max = x.max()
        t1 = np.linspace(x1_min, x1_max, N)
        t2 = np.linspace(x2_min, x2_max, M)
        x1, x2 = np.meshgrid(t1, t2)  # 生成网格采样点
        x_test = np.dstack((x1.flat, x2.flat))[0]  # 测试点
        
    
        cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF'])
        cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b'])
        y_hat = clf.predict(x_test)  # 预测值
        y_hat = y_hat.reshape(x1.shape)  
        plt.subplot(2, 3, i+1)
        plt.pcolormesh(x1, x2, y_hat, cmap=cm_light)  # 预测值
        plt.scatter(x[pair[0]], x[pair[1]], c=y, edgecolors='k', cmap=cm_dark)  # 样本
        plt.xlabel(iris_feature[pair[0]], fontsize=10)
        plt.ylabel(iris_feature[pair[1]], fontsize=10)
        plt.xlim(x1_min, x1_max)
        plt.ylim(x2_min, x2_max)
        plt.grid()
        plt.title(u'准确率:%.2f%%' % (score * 100), fontdict={'fontsize':15})
    plt.suptitle(u'鸢尾花数据在决策树中两两特征属性对目标属性的影响', fontsize=18, y = 1)
    plt.tight_layout(2)
    plt.subplots_adjust(top=0.92)
    plt.show()
    

    特征: 花萼长度 + 花萼宽度
    预测正确数目: 127
    准确率: 84.67%
    特征: 花萼长度 + 花瓣长度
    预测正确数目: 148
    准确率: 98.67%
    特征: 花萼长度 + 花瓣宽度
    预测正确数目: 146
    准确率: 97.33%
    特征: 花萼宽度 + 花瓣长度
    预测正确数目: 146
    准确率: 97.33%
    特征: 花萼宽度 + 花瓣宽度
    预测正确数目: 145
    准确率: 96.67%
    特征: 花瓣长度 + 花瓣宽度
    预测正确数目: 149
    准确率: 99.33%

    在这里插入图片描述

    展开全文
  • dataframe.head(3) 新DataFrame 获取前三行,默认获取前五行 dataframe.tail(3) 新DataFrame 获取后三行,默认获取后五行 dataframe.index 获取index dataframe.columns 获取columns, DataFrame的列索引列表 ...
  • Unity 之 打包参数 -- Player面板属性详解

    千次阅读 多人点赞 2021-10-24 10:28:34
    3.2 Standalone Player Options 部分 3.3 实例:代码设置启动尺寸 四,Splash Image(默认开场图像) 4.1 属性说明 4.2 证书对启动动画设置权限说明: 4.3 个人版使用示例 ,Other Setting(其他设置) 5.1 ...
  • CSS学习之 定位布局

    2020-12-03 06:55:04
    块级元素生成一个矩形框,作为文档流的一部分,行内元素则会创建一个或多个框,置于其父元素中。 relative:元素框偏移某个距离。元素仍保持其未定位前的形状,它原本所占的空间仍保留。 absolute:元素框从文档流...
  • 本文适用人员:本文比较长,适合不理解Qt Designer部件属性的人员阅读或资料查找。 声明:如果有人认为本文是复制粘贴+翻译而成的,敬请读本文最后的后记。 在Qt Designer中,提供了八大类可视化组件(也称为组件或...
  •  记外部力 F = −∇ P, Kass等将上式离散化后,对x(s)和y(s)分别构造两个对角阵的线性方程组,通过迭代计算进行求解。在实际应用中一般先在物体周围手动点出控制点作为Snakes模型的起始位置,然后对能量函数迭代...
  • 基于OpenCV的形状检测

    万次阅读 多人点赞 2019-05-14 16:25:24
    摘要 ...今天,我们将利用轮廓属性来实际标记和识别图像中的形状,就像本文顶部的图中一样。 OpenCV形状检测 在开始学习本教程之前,让我们快速回顾一下我们的项目结构: OpenCV形状检测壳 | — p...
  • (盒模型)个用来描述盒子位置、尺寸的属性: ①宽度 width、 ②高度 height、 ③内边距padding、 ④边框 border、 ⑤外边距 margin。
  • 使用Python绘制词云图(自定义形状)

    千次阅读 2021-07-04 13:23:24
    text) print(cut_text) #第一个参数 字体路径 cloud=WordCloud( background_color='black', width=700, height=300, max_words=2000, max_font_size=40, mask=bg_pic#该属性 字体显示形状 在非白色部分显示!...
  • Excel 属性及方法

    千次阅读 2016-12-21 21:30:33
    属性值 鼠标形状 xlDefault 缺少型值,鼠标呈缺少形状 xlWait 等待型值,鼠标呈不断翻转的沙漏形状 xlNorthwestArrow 箭头型值,鼠标呈标准箭头形状 xlIBeam 文本型值,鼠标呈“I”字形以等待用户输入文本 ...
  • PyQt5中的QtDesinger界面各类属性

    千次阅读 多人点赞 2020-08-25 22:19:51
    设置控件的格式 上面的控件中使用了QVBoxLayout、Label、Line Edit、Radiao Button、Push Button控件 当我们要查看或者修改类的属性时,只需要点击对象查看器中对应的类,并修改下面的相应的属性。 在上面例子中...
  • Matlab:绘图常用的属性配置

    万次阅读 2018-07-13 20:48:10
    1、线条、标记和颜色的选项   线条类型 标识符 点类型 标识符 颜色 标识符 实线  - 点 ... ×形状 x 红色 r 虚线 -- 加号 + 青色 c   ...
  • TypeScript(二)数据类型、任意值、类型推论、联合类型、接口(Interfaces、可选属性?:、任意属性、只读属性) 文章目录TypeScript(二)数据类型、任意值、类型推论、联合类型、接口(Interfaces、可选属性?:、...
  • 同时,需要解决大小问题(目标存在各种不同的大小)和形状问题(目标可能有各种不同形状)。 3.目标检测算法常用分类 每个领域的分类方法通常各式各样,这里主要介绍两种分类方法。 (1) 基于应用程序的角度分类 ...
  • 常用css样式大全以及css属性代码大全

    千次阅读 多人点赞 2020-10-09 12:52:17
    字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD 样式 {font-style: oblique;}(偏斜体) italic;(斜体) normal;(正常) 行高 {line-height: ...
  • 在写论文的时候,经常要用到Matlab绘制一些曲线,包括曲线的形状、粗细、颜色等,可以通过以下的piot函数实现。
  • opencv形状识别学习总结

    万次阅读 多人点赞 2016-03-16 13:20:30
    基于边缘的方法:在小邻域内有两个不同的主边缘方向,实际图像中,孤立点、线段端点也会有类似特 性。缺点是:1)需要先提取边缘并编码,计算量大;2)局部变化对稳定性影响大。   基于灰度的方法:计算点的...
  • CSS属性大全

    万次阅读 多人点赞 2017-06-01 08:00:30
    字体属性:(font) 大小 font-size:x-large;(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD 样式 font-style:oblique;(偏斜体) italic;(斜体) normal;(正常) 行高 line-height:normal;...
  • qss 属性介绍大全

    千次阅读 2018-11-22 11:26:00
    字体属性:(font) 大小 {font-size: x-large;}(特大) xx-small;(极小) 一般中文用不到,只要用数值就可以,单位:PX、PD 样式 {font-style: oblique;}(偏斜体) italic;(斜体) normal;(正常) 行高 {lin...
  • CSS常用属性速查表

    千次阅读 2016-03-20 01:34:56
    属性太多,对于我这种不深入WEB的人员,还是有个速查表方便多了,注意利用开头的目录,会不断更新的 CSS 字体属性(Font) 属性 描述 CSS  font 在一个声明中设置所有字体属性。 1  font-family 规定文本...
  • python tkinter(二) 下拉框(combobox)组件的属性说明及示例 Python tkinter(三) 单选框(Radiobutton)组件的属性说明及示例 Python tkinter(四) 文本框(Text)组件的属性说明及示例 Python tkinter()...
  • 在Designer中Item Views中的table View的属性只有showGrid、gridStyle、sortingEnabled、wordWrap、cornerButtonEnbaled以及Header这些属性,如图: table View对应的类为QTableView,QTableView类提供表视图的默认...
  •  //我的形状是多边形,有条边,3条边框, 颜色的淡蓝色, 样式为填充 c[shape = polygon, sides = 4, skew= 0.4, lable = "hello world"]; //我的形状是4变形, 角的弯曲度0.4, 里面的内容为...
  • 属性名称 说明 index 索引 index.name 索引名称 columns 列索引 columns.name 列索引名称 values 存储DataFrame数值的numpy数组 axes 索引和列索引 ndim 维度 shape 形状,元组 size 元素个数 dtypes 列的...
  • MPAndroidChart常见设置属性(一)——应用层

    万次阅读 多人点赞 2016-08-16 17:08:37
    MPAndroidChart常见设置属性(一)——应用层 MPAndroidChart项目实战(一)——实现对比性柱状图 MPAndroidChart项目实战(二)——双平滑曲线(双折线图)和MarkView实现 MPAndroidChart项目实战(三)——饼状...
  • ACCESS入门教程()数据的类型和属性 怎样使用表设计器来创建表?  我们已经知道怎样用表向导来设计表了,这一课学习怎样使用表设计器来建立表。 表设计器是Access中设计表的工具,用表向导建立表的时候,它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 20,396
精华内容 8,158
关键字:

不同形状的五行属性