精华内容
下载资源
问答
  • 本文中所涉及的代码,在未特殊声明的情况下,都是基于Python3程序设计语言编写的。 建议您在PC浏览器中阅读本文,以获得更好的阅读体验。0问题描述 实现一个函数,该函数接收一个n×n二维矩阵matrix,将该矩阵...

    关注微信公众号“酸痛鱼”,获得更多最新最全的文章。

    本文中所涉及的代码,在未特殊声明的情况下,都是基于Python3程序设计语言编写的。

    建议您在PC浏览器中阅读本文,以获得更好的阅读体验。

    0

    问题描述

    实现一个函数,该函数接收一个n×n二维矩阵matrix,将该矩阵顺时针旋转90度。要求直接对参数matrix进行修改,函数不返回任务东西。

    例如:

    给定 matrix =
    [
        [1, 2],
        [3, 4],
    ]
    旋转后为matrix=
    [
        [4, 1],
        [3, 2],
    ]
    
    给定matrix=
    [
        [1, 2, 3],
        [4, 5, 6],
        [7, 8, 9],
    ]
    旋转后matrix=
    [
        [7, 4, 1],
        [8, 5, 2],
        [9, 6, 3],
    ]

    在力扣上可以找到相同的题目,叫《旋转图像》,其官方题解中,给出了本文中最后一种(第四种)解法的两种实现方式,感兴趣的读者可以去了解一下。

    本文中讨论到坐标时,都是以Python语法为参照的,即坐标是从0开始算的。由于旋转操作涉及到移动每一个元素,所以本题目的所有解法的时间复杂度都是O(N^2),也就是至少遍历一次matrix。

    对于矩阵的一次置换操作,如果连续做两遍,矩阵又回到了原来的样子,我们称这个置换是可逆的;否则,我们称这个置换是不可逆的。

    1

    公式法

    对矩阵进行顺时针90度旋转,相当于把每个坐标(r, c)的元素移动到(tr, tc)上,这两个坐标满足如下的转转换关系:

    tr = c
    tc = n- r - 1

    需要注意的是,上面的转换操作是不可逆的,比如A→B, B→C,A和C是不同的元素。当我们把A移动到B的时候,B的值被改成了A的值。所以我们必须先记录B的值,再做B→C的操作。同样,做B→C时,必须先记录C的值。实际上,我们并没有办法动态记录这些信息,所以我们只能先拷贝一份matrix,然后借助这份拷贝来直接对matrix进行操作。所以,这种解法遍历了两次matrix,拷贝一次,转换一次;而空间复杂度则为O(N^2)。

    def rotate(matrix):
        n = len(matrix)
    
        # 复制matrix
        copy = [[matrix[r][c] for c in range(n)] for r in range(n)]
    
        # 转换公式:源坐标(r, c),目标坐标(tr, tc)
        # tr = c, tc = n-r-1
        for r in range(n):
            for c in range(n):
                tr = c
                tc = n - r - 1
                matrix[tr][tc] = copy[r][c]

    2

    二次置换法

    将矩阵顺时针旋转90度,可以通过二次置换得到:先将矩阵倒置,再将倒置后的矩阵的每一个行的元素顺序倒置。

    8b2f127b20276da85f23158a38479227.png

    因为这两种置换操作都是可逆的,所以通过这个方式,空间复杂为O(1);而这种方式也是遍历两次matrix,遍历次数与第一种解法的一样。

    def rotate(matrix):
        n = len(matrix)
    
        # 矩阵倒置,即(r,c)->(c,r)
        for r in range(n):
            for c in range(r, n):
                matrix[r][c], matrix[c][r] = matrix[c][r], matrix[r][c]
    
        # 每一行倒转
        for r in range(n):
            # 以下两行相当于:matrix[r] = matrix[r][::-1]
            # 本着不修改matrix内部结构的原则,用下面的方式
            for c in range(n // 2):
                matrix[r][c], matrix[r][n - 1 - c] = matrix[r][n - 1 - c], matrix[r][c]

    3

    边整体旋转法

    对于行列数都为n的矩阵,它总共有ceil(n / 2)圈(ceil表示向上取整)。我们可以通过对每一圈的四条边进行顺时针旋转来实现总体的效果。在边旋转过程中,我们需要先临时记录其中一条边的值,以便在最后将其放到目标的位置。所以边旋转法的空间空间复杂度为O(N),而且只对matrix遍历了一次。

    ccd379e55c4d96b381be22b6652e2d85.png

    每条边从起始位置旋转到目标位置的坐标转换公式,各位读者请自行推导,本文将不对此进行详细解说。

    def rotate(matrix):
        n = len(matrix)
        mi = n - 1 # 最大索引
    
        # 每一圈loop,对四条边单独旋转
        for loop in range(n // 2):
            # 每一圈边长
            length = mi - 2 * loop
    
            # 将左边存储到临时变量left中
            left_c = loop
            left_r_start = loop
            left = [matrix[left_r_start + i][left_c] for i in range(length)]
    
            # 将底边存到左边
            bottom_c_start = loop
            bottom_r = mi - loop
            for i in range(length):
                matrix[left_r_start + i][left_c] = matrix[bottom_r][bottom_c_start + i]
    
            # 将右边存到底边
            right_c = mi - loop
            right_r_start = mi - loop
            for i in range(length):
                matrix[bottom_r][bottom_c_start + i] = matrix[right_r_start - i][right_c]
    
            # 将上边存到右边
            top_r = loop
            top_c_start = mi - loop
            for i in range(length):
                matrix[right_r_start - i][right_c] = matrix[top_r][top_c_start - i]
    
            # 将左边,即left存到上边
            for i in range(length):
                matrix[top_r][top_c_start - i] = left[i]

    4

    边元素依次旋转法

    事实上,我们可以对每一圈的每条边上的每个元素单独进行旋转,这样的话,我们只需要临时记录其中的一个元素,以达到空间复杂度为O(1)的实现。

    边元素旋转过程如图所示:

    9121e5a83625dee2d4c1c5a944dda120.png
    def 

    e7d9df7f31ec65233e4b2923018ab807.png
    微信扫码关注我哦
    展开全文
  • Python= 46/365●有了数据就有了一切!回到枯燥而重要的数据部分。数据枯燥吗?一点儿都不。想想你看到的股票画面,想想你看到的成绩单,再想想你的信用卡账单????????????哪里枯燥,一点儿也不……日更不停,你看...
    Python = 46/365

    有了数据就有了一切!回到枯燥而重要的数据部分。数据枯燥吗?一点儿都不。想想你看到的股票画面,想想你看到的成绩单,再想想你的信用卡账单🤩🤩🤩哪里枯燥,一点儿也不……

    434b6e990523ba2b903ec1991b15b0e8.gif

    日更不停,你看行不行?

    我带着你,你带着Python Flag,共勉!

    No.1 Python-NumPy数组操作(2)
    (1)算术运算
    数组上的算术运算符按元素应用。创建一个新数组,并用结果填充。
    >>> a = np.array( [20,30,40,50] )>>> b = np.arange( 4 )>>> barray([0, 1, 2, 3])>>> c = a-b  >>> carray([20, 29, 38, 47])
    以上是减法,表示对应元素的差值
    #数组b的平方运算>>> b**2array([0, 1, 4, 9])
    当然,当然,更复杂的来了!
    >>> 10*np.sin(a)array([ 9.12945251, -9.88031624,  7.4511316 , -2.62374854])>>> a<35array([ True,  True, False, False])

    (2)矩阵运算

    与许多矩阵语言不同,乘积运算符*在NumPy数组中按元素进行运算。可以使用@运算符(在python> = 3.5中)或dot点函数或方法执行矩阵乘积:
    >>> A = np.array( [[1,1],[0,1]] )>>> B = np.array( [[2,0],[3,4]] )>>> A * B array([[2, 0],       [0, 4]])>>> A @ Barray([[5, 4],       [3, 4]])>>> A.dot(B) array([[5, 4],       [3, 4]])
    No.2 Python-NumPy数组索引、切片        一维数组可以被索引,切片和遍历,就像列表和其他Python序列一样。
    >>> a = np.arange(10)**2>>> aarray([ 0,  1,  4,  9, 16, 25, 36, 49, 64, 81])>>> a[2]4>>> a[2:5]array([ 4,  9, 16])

    a [:6:2] = 1000;

    从开始到位置6(不包括位置6),将每个第二个元素设置为1000

    >>> a[:6:2] = 1000>>> aarray([1000,    1, 1000,    9, 1000,   25,   36,   49,   64,   81])
    No.3 Python-NumPy的Shape操作 shape 数组的形状 reshape改变数组的形状
    >>> aarray([1000,    1, 1000,    9, 1000,   25,   36,   49,   64,   81])>>> a.shape(10,)>>> a.reshape(5,2)array([[1000,    1],       [1000,    9],       [1000,   25],       [  36,   49],       [  64,   81]])>>> a.shape(10,)
    数组的形状可以使用各种命令来更改。请注意,以上命令均返回修改后的数组,但不更改原始数组。

    一个人可以随意地阅读和学习,却不能随意地思考。

    --叔本华4ed4457d663059bc63468f6eb725fc05.png

    • Python365专辑

    Python,365! 5035b499443df5ee344ae36b38bf5934.png 9dd6ce8db6cb7a584e1f86b7ae7c34ec.png 34757ab232017e85ba1c043a880a8f5a.png
    展开全文
  • 注:对于没有参加过培训,或者没有python、三角、矩阵基础的朋友,如果要完全理解文中代码,需先适当补充相应基础知识! NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型...

    注:对于没有参加过培训,或者没有python、三角、矩阵基础的朋友,如果要完全理解文中代码,需先适当补充相应基础知识!

           NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表要高效的多,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库,在整个python生态中占有举足轻重的作用,本篇文章旨在讲解如何借助它来提升python的计算性能。

           在使用python进行模型点的计算过程中,经常需要遍历所有点,如果点的数量很多,则运行是非常慢的,那么,如何避开使用循环语句,而又能对每个点分别进行操作呢,答案就是:numpy!当然,除了numpy之外,python还有很多其它优秀的库,但鉴于Houdini只内置了numpy库,故本篇文章只讨论numpy的提速方法。

           numpy的计算对象通常来说都是数组或矩阵,我们所做的每一个操作都是针对数组里每个元素的,借助此特性,无需再像以前那样非得使用for循环来访问数组中的每个元素了,下面我们还是通过具体实例来说明numpy是如何对数组进行整体性操作的。首先创建一个含有10个元素的数组,然后对每个元素执行sin正弦函数计算,代码如下:

    import  numpy  as  np

    x = np.arange(0,10)

    s = np.sin(x)

    print(x)

    print(s)

    结果:[0 1 2 3 4 5 6 7 8 9]

    [ 0. 0.84147098 0.90929743 0.14112001 -0.7568025 -0.95892427 -0.2794155   0.6569866   0.98935825  0.41211849]

           上述代码中,np.arange()函数和python默认的range()函数用法类似,这里得到0-9整数,并将这10个整数送入sin()函数计算正弦值,numpy的函数可以对数组的每个元素进行一次性的整体操作,而无需for循环,从而极大的提高了计算速度,形式上也更加简洁明了。当然你可能会担心,numpy提供的数值计算函数是不是和python默认的一样丰富,对此你大可放心,numpy提供的计算函数比python默认的和vex加起来都要丰富,是完全够用的。当今机器学习全部算法都可以用numpy编写出来,所以像在cg中的这点应用是足够应付的,因此大可放心使用。

           有了对numpy的初步认识后,下面我们就进入正题,看看如何用它对模型点进行常规的属性计算。这里我安排了一个常见的涟漪变形实例,众所周知,编写变形器都是对点位置P属性进行设置,但P是向量属性,所以在numpy中处理向量数据要比一般的浮点数据更麻烦一些,需要引入更多的操作,故以此为例进行演示。虽然例子简单,但numpy代码相对于传统python代码还是要晦涩一些,如果初次接触numpy,可能略感不适,但只要静下神儿来,用心体会,还是不难掌握的。代码不多,先贴出来,再逐一解释,如下:

    注:因为三角函数是通过泰勒级数展开求得的,故包含了大量的乘除法运算,因此使用三角函数来评估计算性能是比较合适的。

    e768ccd7cd7542516e8ef9ca8dd2fa5b.png

           涟漪变形需要计算出每个点到涟漪中心的距离,再将该距离作为变量传给正弦函数即可,为尽量简化代码,这里暂不做涟漪衰减。首先调入所有点的坐标,但不能使用for循环,因此这里使用了geo.pointFloatAttribValues("P")函数,它可以将所有点的属性放置在一个元组当中,对于P位置属性,因为是向量,所以1-3元素是第1个点的坐标,4-6元素是第2个点的坐标,7-9是第3个点的坐标...以此类推。如果模型有100个点,则元组中会有300个元素值。因为geo.pointFloatAttribValues()函数返回的是python标准的Tuple元组类型,该类型不能直接被numpy所使用,我们需要将元组类型转化为numpy默认的数组或矩阵类型方可使用,所以使用了np.array(pos)函数进行转化,这样的数组才能被numpy使用。np.array(pos)是个一维数组,为了后面的计算,需将其转化为矩阵(二维数组),使矩阵的每一行对应每一个点,每一列对应每个点的位置P的三个坐标,因此使用了reshape()函数对矩阵形态进行了设置。reshape()函数第一个参数是矩阵的行数,第二个参数是矩阵的列数,这里写的是reshape(npt,3),显而易见,矩阵的行数就是点总数,矩阵的列数就是属性P的分量个数。为了简单起见,将变形的grid1网格平面设置为4个点,现在来查看矩阵的数值特点,如下图所示:

    0b5b8d674b192f7ac46c8af311547983.png

           虽然现在的数据分布非常清晰,但是不利于计算,比如我们要设置每个点的高度,即P属性的第二个分量,则就要对矩阵的第二列进行设置,但是对于多维数组而言,列的读取要比行的读取麻烦很多,因此有必要将对列的读取转化为行的读取,这个操作通过行列互换即可实现,也就是矩阵的转置操作,numpy对矩阵转置使用.T操作符即可(也可使用transpose函数),转置后的矩阵如下图所示:

    f292a14766bb19ce0850b1e74a0b9129.png

           现在的结构非常直观,第一行表示每个点x坐标,第二行表示每个点y坐标,第三行表示每个点z坐标,如果要对y坐标进行设置,只需获取第二行,即posT[1]。因为我们编写的是涟漪变形,所以还需要一个点到涟漪中心的距离数据,求两点间距离可以用np.linalg.norm()函数,其中np.linalg是numpy的线性代数库,norm()函数是该线性代数库中的求范数函数,范数是泛函分析中的一个术语,是不同条件下的长度度量,我们不用深究,只要知道空间直角坐标系下,求两点间距离可以使用2范数即可,所以norm()函数第二项输入2,因此norm()函数写法为norm(pos,2,1),第一项pos显然是坐标矩阵,第二项是计算距离的方式,第三项是说明矩阵是按照列向量还是按照行向量去计算距离,如果输入0表示按列向量去计算,输入1表示按行向量去计算,因为pos变量是每一行代表一个坐标,因此是行向量,所以应该按行向量来计算距离,所以这里输入1,norm()函数的计算结果如下图所示:

    :如果涟漪中心不在原点,则应该用点坐标减去涟漪中心坐标所确定的向量,来作为输入给norm()函数的第一项,本例涟漪中心是原点(0,0,0),所以可省略。

    9452bb689ab96322cb3d9260b3b75b9f.png

           有了点到中心距离这个数据后,将其输入给sin()正弦函数,并作为平面新的高度,即可产生涟漪效果,这里使用numpy提供的sin函数来计算,如下图:

    ceb268d585c226204d583daf6010bd16.png

           其中posT[0]表示所有点的x坐标,posT[2]表示所有点的z坐标,它们保持不变,只对y坐标进行np.sin()的设置,并且添加了hou.time()时间偏移,让涟漪变形可以随着时间产生变化,最后将设置好的坐标存储在ripple_pos变量中,ripple_pos变量是包含三个元素的元组,每个元素又是个numpy数组,分别存储着每个点的xyz坐标。因为ripple_pos是元组的关系,还是不能直接用numpy进行处理,所以我们调用了np.vstack()函数,它可以将ripple_pos变量中的每个元素(也即每个数组)摞起来,形成一个numpy二维矩阵,如下图所示:

    bd9610a32ace798d5bdd2c736cc11629.png

           最后,我们需要将数据作用给点的P属性,需要用到geo.setPointFloatAttribValues()函数,但该函数的数据格式和前面的geo.pointFloatAttribValues()相同,需要一个点接一个点的把P属性值填进去,所以我们要对前面摞起来的矩阵进行转置处理,让它每一行表示一个点的坐标,因此需要做转置处理,如下图所示:

    03cd73f7099b3da88a673623bc735e86.png

           现在得到的结果是个二维数组,而geo.setPointFloatAttribValues()函数需要的是个一维数组,因此需要使用flatten()函数将二维数组展开成一维数组,如下图所示:

    8097760b84999dc9d06cff9026baf873.png

           现在的数据完全没问题了,可以填进geo.setPointFloatAttribValues()函数,该函数可以直接使用numpy一维数组,所以即使不转为标准的python元组也没问题,至此,基于numpy的涟漪变形器就写完了,下面可以做个传统的基于for循环的方法,和numpy方法的速度评测,如下图所示:

    fe80d3bdaa2ed8ca8189df60300e1299.png

    d523534f34a1ff620ebdeed09189c232.png

           可见,numpy库使python速度有了10倍的提升,足足快了一个数量级!

    注:numpy的常用函数网上很容易找到,这里不再赘述。

    9bc6d9f57270e417edbdf2644be6b93d.png

    更多技术请关注

    展开全文
  • 很多同学抱怨自己很想学好Python,但学了好久,书也买不少,视频课程也看了不少,但是总是学了一段时间,感觉还是没什么收获,碰到问题没思路,有思路写不出多少行代码,遇到报错时也不知道怎么处理。从入门到放弃,...

    大家好,我是大师兄。

    很多同学抱怨自己很想学好Python,但学了好久,书也买不少,视频课程也看了不少,但是总是学了一段时间,感觉还是没什么收获,碰到问题没思路,有思路写不出多少行代码,遇到报错时也不知道怎么处理。

    从入门到放弃,这是很多学习python的同学常常挂在嘴边上的口头禅。今天我分享一些自己学习Python的心得,并用一个案例来说明python解决问题的基本思路和框架。

    1 如何学好Python

    1.1 明确自己的需求(最好是刚需)

    听到别人说Python很牛很厉害,也想跟着学,这样的人肯定是学不好python的。没有明确的需求和动力,就会导致你学python两天打鱼三天晒网,没有恒心也没有决心。

    假如你有明确的需求,比如:

    • 老板让我1周内完成一个数据分析报告
    • 老板让我1个月内搭建一个自己的blog网站
    • 我要处理很多excel文件,我想写一个脚本帮我自动处理
    • 我每天都在手动审核数据质量,我想写一个脚本代替我的日常工作
    • .......

    当你面对这样一些需求时,你还无法求助他人帮忙时,这个时候,你就必须学习Python来帮你处理了。

    1.2 明确Python的学习方向

    Python的学习方向有很多,比如:

    • WEB方向
    • GUI方向
    • 数据处理方向
    • 数据分析方向
    • 人工智能方向
    • ......

    我是日常用Python主要做数据处理和数据分析工作,所以我选择的是数据处理和数据分析方向,其他Python功能接触的比较少。

    1.3 掌握Python的基本语法

    • import模块导入方法
    • 变量及基本数据类型
    • 循环和条件基本控制语句
    • 模块内嵌函数和自定义函数
    • ......

    不管你选择了什么方向,Python的基本语法是必须掌握的。对于没有编程经验的人,Python是一门非常适合入门的编程语言,因为它是高度封装的,不需要对于底层特别了解,也能够很好学习使用。python语法非常简单,代码可读性高,对于零基础的人来说更容易接受和使用。

    1.4 掌握Python数据处理方法

    • 线性代数和统计学
    • Pandas/Numpy/Matplotlib模块
    • 数据导入、存储
    • 数据清洗和准备
    • 数据规整:连接、联合、重塑
    • 数据整合和分组操作
    • 时间序列数据操作
    • 绘图和可视化

    利用Python做数据处理,线性代数和统计学这两门基本理论知识还是要会点,线性代数你至少得需要知道矩阵和矩阵运算规则,统计学你至少要知道描述性统计。

    常用的Python数据处理模块有Pandas和Numpy这两个,这是必须要掌握的,另外,Matplotlib模块是数据可视化模块,也是必须会的。

    数据导入、清洗和准备、规整、分组等操作,都是数据处理中常用的方法,平常对比Excel数据操作,Python都可以实现,而且一行简单的代码,就可以操作比较复杂的数据处理方法。

    1.5 多练!多练!多练!

    • 自己找些小作业练习
    • 解决平常工作中的问题
    • 可以尝试输出文章

    重要的事情说三遍,多练!多练!多练!

    Python和数据分析都是实践学科,光学理论,不练习,是不会有任何收获的,学完之后不练就忘掉了。最好的方式,就是先掌握一点基础语法,然后把Python融合到工作中,解决日常工作中碰到的问题。在解决问题的时候,你会碰到各种问题,可以去"百度"寻找答案。最后,要定期总结和输出。

    特别提示,假如你没有基础或者基础薄弱的话,建议工作期间不要尝试用Python解决复杂的问题,这是一个很浪费时间的事情,中间各种问题,会让你崩溃。最终Python没学好,还耽误了工作。所以,要利用工作之余的时间,把python基础打扎实。

    2 Python数据处理示例

    2.1 安装并搭建python环境

    首先,需要安装python,我要推荐Anaconda3,从事数据分析的伙伴们,严重推荐此软件!

    Anaconda降低了数据分析初学者的学习门槛,因为这个软件自带了python中大概有1000多个数据科学包,让你无需单独学习每个库的安装方法。另外,还自带了Jupter notebook代码编译器。现在,Anaconda和Jupyter notebook已成为数据分析的标准环境。

    具体的安装方法参考如下链接:

    https://mp.weixin.qq.com/s/53-KvHGYqCSx8qtUnub_vw

    安装完成后,打开Jupter Notebook,就可以在上面输入代码。

    299c33c8-b912-eb11-8da9-e4434bdf6706.png

    2.2 问题说明

    现在工作中面临一个批量化文件处理的问题:就是要把每个二级文件下csv文件合并到一个数据表里,同时要在最终的数据表里增加两列,一列是一级文件目录名称,另一列是二级文件目录名称。

    • 总共有105个一级文件目录
    • 每个一级文件下有若干个二级文件
    • 每个二级文件下有若干个csv格式的数据

    当工作中,碰到这样的问题时,我用最笨拙的方法——人工,一个一个文件整理,但是效率比较低,可能需要一个人一天的工作量。当然,我也可以寻找技术的帮忙,找一个Java工程师,这个问题也很容易解决,但麻烦别人一次,没问题。以后碰到类似的问题,总是麻烦,就不好了。假如自己掌握了Python,这个问题就变得很简单了。

    2.3 程序实现

    其实这个问题,对于一个专业的Python程序员来说,是一个再简单不过的问题。但是对于一个初学者来说,要解决这个问题,恐怕需要费一点时间和脑力。

    编程之前,我是如何思考的:

    1、首先,要读取文件名称,需要引入OS模块下的listdir函数

    2、其次,遍历所有一级、二级、三级文件名称,需要用到for循环和循环嵌套

    3、然后,读取文件下csv表,需要用到pandas模块下的read_csv函数

    4、最后,整理合并后的所有表,需要用到DataFrame的操作方法

    实现代码如下:

    #导入模块import osimport pandas as pd##定义一个读取文件名的函数def readname(a):    filePath="D:ad_data"+a+""    name=os.listdir(filePath)    return name#声明初始变量a=""name= readname(a)data_new =pd.Dataframe()#循环遍历文件名称for i in name:    name1=readname(i)    for j in name1:        file_path = "D:ad_data"+i+""+j+""        name3=os.listdir(file_path)        for t in name3:            csv_path = "D:ad_data"+i+""+j+""+t            data=pd.read_csv(csv_path)            data['广告主']=i            data['行业']=j            f = lambda x:x[0:7]            data['日期']=data['日期'].apply(f)            data['投放费用']=data['投放费用']/10000            data=data.drop(columns=['行业排名'])            data_new=data_new.append(data)#导出数据file = os.getcwd() + 'ad.csv'data_new.to_csv(file, index=False,encoding='utf_8_sig')

    这段代码虽然简单,但基本攘括了Python的大部分基本语法,接下来我带大家一一解剖下这些基本语法。

    • import语句
    • 声明变量
    • 数据导入和导出
    • 循环和嵌套循环
    • 模块函数调用
    • 自定义函数
    • Lambda表达式
    • Dataframe及操作

    3 Python基本语法详解

    3.1 import详解

    下面程序使用导入整个模块的最简单语法来导入指定模块:

    import os #导入OS模块import pandas as pd #导入pandas模块

    使用Python进行编程时,有些功能没必须自己实现,可以借助Python现有的标准库或者其他人提供的第三方库。像OS和pandas,都是标准库,导入后,就可以在程序中使用其模块内的函数,使用时必须添加模块名作为前缀。

    name3=os.listdir(file_path) #导入os模块下的listdir函数

    假如模块名长,就可以取别名,比如pandas模块,取别名为pd。像os模块,由于比较简短,就没有取别名。别名的作用,就是调用该模块下的函数时,减少代码的复杂度。

    import pandas as pddata=pd.read_csv(csv_path)

    3.2 数据导入和导出

    数据的导入是数据处理和分析的第一步,日常我使用的比较多的是利用pandas进行数据输入和输出,尽管其他库中也有许多工具可帮助我们读取和写入各种格式的数据。

    将表格型数据读取为DataFrame对象是pandas的重要特性

    • read_csv(csv文件输入函数)
    • read_table(文本文件输入函数)
    • to_csv(数据输出函数)
    #遍历所有文件路径,读取所有文件下csv文件数据csv_path = "D:ad_data"+i+""+j+""+tdata=pd.read_csv(csv_path)

    当然,数据的输入,也有与数据库交互读取数据,也有与WEB API交互读取数据,这个是属于进阶的内容,后期带大家学习。

    3.3 声明变量

    变量是Python语言中一个非常重要的概念,其作用就是为Python程序中的某个值起一个名字。类似于"张三"、"李四"一样的名字。在Python语言中,声明变量的同时需要为其赋值,毕竟不代表任何值的变量毫无意义。

    a="" #声明一个空字符类型data_new =pd.Dataframe() #声明一个空数据集格式

    声明变量非常简单,语法结构:等号(=)左侧是变量名,右侧是变量值,Python编译器会自动识别变量的数据类型。

    说到变量,就不得不谈Python的基本数据类型,Python有6个标准的数据类型:

    • Number(数字)
    • String(字符串)
    • List(列表)
    • Tuple(元组)
    • Set(集合)
    • Dictionary(字典)

    学习Python,掌握其基本数据类型,特别重要!重要!重要!详细的介绍,见:

    https://www.runoob.com/python3/python3-data-type.html

    3.4 控制语句

    我们所见到的程序,有很多程序都是按照顺序从上到下执行它们。如果你想要改变语句流的执行顺序,也就是说你想让程序做一些决定,根据不同的情况做不同的事情。这个时候,就需要通过控制流语句来实现。

    在Python中有三种控制流语句——if、for和while。详细的知识点,见如下:

    if语法讲解

    https://www.runoob.com/python/python-if-statement.html

    while语法讲解

    https://www.runoob.com/python/python-while-loop.html

    for语法讲解

    https://www.runoob.com/python/python-for-loop.html

    嵌套for语法讲解

    https://www.runoob.com/python/python-nested-loops.html

    本次实例中,需要读取一级文件目录名称、二级文件目录名称、三级csv文件目录名称,并逐个遍历它,于是选择了for循环。for循环就是个迭代器,当我们在使用for循环时,即重复运行一个代码块,或者不断迭代容器对象中的元素,比如一些序列对象,列表,字典,元组,甚至文件等,而for循环的本质取出可迭代对象中的迭代器然后对迭代器不断的操作。

    for i in name: #第一层循环,读取一级文件目录名称    for j in name1: #第二层循环,读取二级子文件目录名称        for t in name3: #第三层循环,读取csv文件目录名称    

    3.5 模块函数调用

    函数是组织好的,可重复使用的,用来实现单一、或者相关功能的代码段。

    函数能提高程序的模块性,和代码的重复利用率。Python提供了许多标准模块的内建函数,比如os模块下的listdir函数,用来读取文件的名称,pandas模块下的read_csv函数,用来读取csv文件的数据。当然,也可以自己创建函数,也就是所谓的自定义函数,下一节详细讲。

    import os #导入OS模块import pandas as pd #导入pandas模块name=os.listdir(filePath) #调用os模块下的listdir函数data=pd.read_csv(csv_path) #调用pandas模块下的read_csv函数

    3.6 自定义函数

    我们可以自定义一个自己想要的功能函数,通常遵循以下规则:

    • 函数代码块以def关键词开头,后接圆括号()和参数。
    • 函数内容以冒号起始,并且缩进。
    • return结束函数,选择性地返回一个值给调用方。不带表达式的return相当于返回None。
    #自定义一个函数,动态传参,读取文件的名称def readname(a):    filePath="D:ad_data"+a+""    name=os.listdir(filePath)    return name

    定义一个函数只给了函数一个名称,指定了函数里包含的参数和代码结构。这个函数的基本机构完成以后,你就可以通过调用该函数来实现你想要的返回结果。

    a=""#调用自定义函数name= readname(a) #参数传递,传一个空字符串

    3.7 Lamda表达式

    Lambda是一个表达式,定义了一个匿名函数,代码x为入口参数,x[0:7]为函数体。非常容易理解,在这里lambda简化了函数定义的书写形式。使得代码更为简洁,更为直观易理解。

    但是lambda函数,在Python社区是一个存在争议的函数,支持方认为,Lambda函数的使用,使得代码更加紧凑。反对法认为该函数用多了反而看起来不那么清晰。

    f = lambda x:x[0:7]data['日期']=data['日期'].apply(f)

    在用pandas做数据处理的时候,个人习惯,apply+lambda配合使用,可以对dataframe数据集中的列做很多很多事情。

    3.8 Dataframe及操作

    DataFrame是一种表格型数据结构,在概念上,它跟关系型数据库的一张表,Excel里的数据表一样。

    创建一个DataFrame

    #根据字典创建一个DataFrameimport pandas as pd data = {    'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],    'year':[2000,2001,2002,2001,2002],    'pop':[1.5,1.7,3.6,2.4,2.9]}frame = pd.DataFrame(data)frame#输出state year pop0 Ohio 2000 1.51 Ohio 2001 1.72 Ohio 2002 3.63 Nevada 2001 2.44 Nevada 2002 2.9

    日常数据处理的过程中,通常是通过读取文件生成DataFrame,最常用的是read_csv,read_table方法。下面是最简单的读取文件语句,该方法中有很多重要的参数,在导入文件时候,通过这些参数,可以控制导入数据的格式和数量。其他创建DataFrame的方式也有很多,比如我经常会从SQL SERVER读取数据来生成。这里就不详细介绍。

    pd.read_csv('C:甥敳獲ivanDesktop数据.csv')

    DataFrame索引、切片

    我们可以根据列名来选取一列,返回一个Series,同时也可以对这一列的数据进行操作。

    #日期格式 2020-07-01,定义一个把日转换成月的函数,转换出2020-07f = lambda x:x[0:7]data['日期']=data['日期'].apply(f)#对"投放费用"这一列进行处理,把单位转换成"万"data['投放费用']=data['投放费用']/10000

    4 总结

    最后,我说下Python与Excel之间的关系,为什么要拿这两个工具比较,因为很人觉得:

    • 日常工作中,Excel足够应对数据处理工作
    • 有人宁愿使用Excel贼6,也不愿意使用python

    从根本上来说,Python和excel都可以作为数据处理和分析以及展现的工具,工具本身没有好与坏,关键在于使用者的业务场景以及使用自身对工具的掌握程度。当两种工具都能达到使用者业务场景想要的效果时,使用者会更倾向于使用自己熟练或者更易于实现的工具高效地解决实际问题。

    所以说,日常大部分与数据相关的工作中,少量数据的处理和分析,excel都足以胜任,除非遇到大样本数据导致excel无法处理或者计算很慢时,这时候python的优势才会体现出来。

    除此之外,如果使用者的业务场景是报表呈现时,excel做出来的结果直接就是可以交付的结果。

    当然,当面临大量需要重复处理的文件或者经常要做的数据工作,这个时候,如果自动化,会大大提高工作效率,这个时候,python的优势也很明显。

    展开全文
  • python遍历一个矩阵

    千次阅读 2021-03-18 10:32:14
    matrix =[[1,2], [3,4]] for i,element in enumerate(matrix): print(i, element) output: (0,0) 1 (0,1) 2 (1,0) 3 (1,1) 4 遍历绝阵,这个是按照矩阵一行行进行遍历,输出矩阵的索引和元素
  • 今天小编就为大家分享一篇python for循环输入一个矩阵的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 今天小编就为大家分享一篇对python遍历文件夹中的所有jpg文件的实例详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • python遍历列表删除元素与修改元素

    千次阅读 2021-01-31 19:31:06
    这两天写代码的时候遇到了,纪录一下,下次就不用去翻别人的了。 删除元素的时候呢,这样写: for i in a[:]: a.remove(i) 如果是修改元素,在遍历时如果想用迭代器对元素进行修改,是不会持久化的,这时候需要...
  • 好久没更新了,肚子里也没什么货,就算python稀疏矩阵的最后一篇吧。之前的路飞的哥哥:多体物理python入门——Ising模型和稀疏矩阵​zhuanlan.zhihu.com计算了本征值,也就是平衡态问题。这次是动力学演化的演示...
  • python遍历二维数组

    千次阅读 2020-07-02 16:06:35
    python遍历二维数组 遍历数组matrix matrix = [ [ 11, 15, 19], [10, 11, 13], [12, 13, 15] ] 第一种方式,这种方式需要每行的长度一致。 代码: for i in range(len(matrix)): for j in range(len(matrix[0])):...
  • Python 遍历数组元素

    2021-07-02 08:46:29
    数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为...本文主要介绍Python 遍历数组元素。 原文地址:Python 遍历数组元素 ...
  • python遍历数组的同时改动数组元素

    千次阅读 2020-03-22 06:26:21
    python的for-loop的特殊性在于其更接近于「遍历」而非循环 Q:存在一个数组,对其进行遍历,符合条件的保留/删除,不符合条件的删除/保留,该如何操作? 错误示例: lst = [1, 1, 0, 2, 0, 0, 8, 3, 0, 2, 5, 0, 2, ...
  • Python遍历修改列表数字元素

    千次阅读 2018-10-31 13:45:54
    dimensions = [1, 2, 3, 4] for dimension in dimensions: print(dimension) for index in range(0, len(dimensions)): dimensions[index] = dimensions[index] * 2 for dimension in dimensions: ...
  • python for循环随机矩阵中的每一个元素 from numpy import*; #不用像as np 那样每次调用时输入np X=random.random((0,2)size(4,4))#创建一个只有0,1分布的4×4的随机矩阵 rows,cols=X.shape#读取X的行列数 for i in...
  • 今天小编就为大家分享一篇Python实现深度遍历和广度遍历的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • python列表的逆序遍历

    2020-12-21 09:44:35
    引题:该题源自一个网友的求助,作为水群龙王的我义不容辞的接下了这道题目,先来看题目: 题目 拿到这道题,题目的意思已经很清楚了,列表里... 来分析一下python是根据列表元素的下标来遍历的。于是最开始元素123
  • python中二维列表的遍历方式

    万次阅读 多人点赞 2018-05-23 17:06:41
    首先,Python中列表和MATLAB中不同,不需要每行的列数相同 利用行列下标索引方式,则必须要求,每行的列数相同. 比如 list2d = [[1,2,3],[4,5]] sum = 0 for i in range(len(list2d)): for j in range(len(list2d[0])):...
  • python-如何遍历数组所有元素并获取其索引
  • 给定一个含有 M x N 个元素的矩阵(M 行,N 列),请以对角线遍历的顺序返回这个矩阵中的所有元素,对角线遍历如下图所示。 输入: [ [ 1, 2, 3 ], [ 4, 5, 6 ], [ 7, 8, 9 ] ] 输出: [1,2,4,7,5,3,6,8,9] 代码 class...
  • 以上这篇Python遍历numpy数组的实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持软件开发网。 您可能感兴趣的文章:numpy自动生成数组详解基于Python Numpy的数组array和矩阵matrix...
  • python获取矩阵某一列元素

    万次阅读 2018-10-22 19:41:29
    对于一个二维矩阵, python如何遍历其某一列元素. 遍历一行是很简单的, 直接使用索引即可, 但是遍历一列呢? 方法一: 直接遍历法 使用一个循环, 对每一行单独找出这列上的对应元素. 方法二: 列表解析法 这个方法其实...
  • /usr/bin/env python # -*- coding: utf-8 -*- def printList(datalist = []): for i in range(len(datalist)): print datalist[i] def mergeList(list1, list2 = []): if len(list1) == 0: return...
  • python获取矩阵列元素

    千次阅读 2020-04-01 17:05:25
    直接遍历法 使用一个循环, 对每一行单独找出这列上的对应元素 列表解析式 每个列表都在 for 之后跟一个表达式,然后有零到多个 for 或 if 子句。返回结果是一个根据表达从... 输出全部列元素: 输出了矩阵的第三列元素
  • 先求出扩充矩阵的维度,再按照每一行每一列遍历,根据元素的索引规律依次赋值,最终实现新的扩充矩阵。这个思路实现如下: import numpy as np def PadMat(Ndim, Mat): Brow = Bcol = 2*Ndim-1 B = np.zeros(...
  • python遍历多维数组

    万次阅读 2018-10-18 19:37:09
    1. 同等长度的二维列表的遍历 a = [[1,2],[1,2]] for i,j in a : print(i,j,';',end=&quot;&quot;) # &amp;gt;&amp;gt;&amp;gt;1 2 ;1 2 ; 2. 同等长度的三维列表的遍历 a = [[1,2,3],...
  • python查找矩阵循环Here, we are going to calculate the value of Nth power of a number without using power function. 在这里,我们将不使用幂函数来计算数字的N 次幂的值 。 The idea is using loop. We will...
  • 对于目录的遍历使用os.walk,在读取文件夹所有文件同时还能获取父目录等信息。   import os import xlrd from xlutils.copy import copy def readdir(rootdir): excel = r'...\mix.xls' try: rdx ...
  • numpy矩阵遍历

    万次阅读 2018-04-03 08:47:28
    1、遍历一个numpy类型的矩阵 我原来一直以为[][]和[,]这两种写法没有区别,其实两种效果完全不一样,对比之后一般不建议[][]这样写! #coding:utf-8 import numpy as np a=np.array([[1,2,3],[4,5,6]]) print(a....
  • 主要介绍了python实现树的深度优先遍历与广度优先遍历,详细分析了树的深度优先遍历与广度优先遍历原理及Python相关实现技巧,需要的朋友可以参考下

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,098
精华内容 10,039
关键字:

python遍历矩阵

python 订阅