python(常练思维不痴呆)Python精选Stata连享会-Python量化

人工智能编程基础(Python)

2019-08-24  本文已影响0人  一个扫地的垃圾

1 Python函数

1.1 函数定义

1.2 参数

1.2.1 位置参数

位置参数为函数定义时实现功能所必要的参数,这个参数代替了函数中的一个位置以实现相应的功能。

def sum(x):
    y = x + x
    return y
print(sum(10)) 

这里的x我们就叫做位置参数,需要注意的一点是python中的输出函数可以直接输出变量的值,而C语言中必须要用格式化字符串输出。

1.2.2 默认参数

默认参数在定义函数的时候给出一个默认值(这里的默认值建议使用常量,而非空列表[]这种不确定的变量),在后续函数调用的过程中可以对参数的值进行更改,需要强调的一点是默认参数必须要在位置参数的后面,否则会报错。

# 下面这种情况会报错···
def sum(x = 1, y):
    z = x + y
    return z
print(sum(10, 20))
# 正确的做法···
def sum(x, y = 2):
    z = x + y
    return z
print(sum(10, 20))
# 只有一个默认参数···
def sum(y = 2):
    z = y
    return z
print(sum(20))
# 有两个默认参数,更多也可类推···
def sum(x =1 , y = 2):
    z = x + y
    return z
print(sum(10, 20))

1.2.3 可变参数

可变参数引入了*符号,通过在定义函数参数时在前面加上一个*来表示参数的个数不固定,可能是一个也可能是多个。此时传入的参数可以是列表(list)也可以是元组(tuple),如果使用列表可以将[]省略。注意区分此时的*不再是C语言中指针的概念。

假如我们想计算n个数的和,但是n不确定,可以使用可变参数。

def sum(*nums):
    sum = 0
    for i in nums:
        sum = sum + i
    return sum
print(sum(1,2,3))

1.2.4 关键字参数

关键字参数的作用在于传入的变量会自动转换为字典(dict),定义的格式为**参数名称,在调用时采用名称=值的方式。

def cat(name,age,**kw):
    print('name:',name,'age:',age,'other:',kw)
cat("ergou", 3, male="M", city="Xi`an") # 二狗是一只来自西安的小猫

输出结果为:

name: ergou age: 3 other: {'male': 'M', 'city': 'Xi`an'}

2 Numpy

Numpy是一个支持高维数组与矩阵运算的扩展库,所有通过Numpy生成的对象都为ndarray。

类和对象的概念可以类比C语言结构体和由结构体定义的变量,类可以比作结构体,而对象的概念可以类比于结构体定义的变量。类相比于结构体不仅可以定义一些基本数据类型还可以定义函数,由结构体定义的变量还称之为变量,而由类定义的变量称之为对象。

2.1 创建数组

import numpy as np
a = np.array([1,2,3]) # 创建一维数组[1,2,3]
b = np.array([[1,2,3], [4,5,6]]) # 创建二维数组[[1,2,3], [4,5,6]]
print("a =\n", a)
print("b =\n", b)

输出结果:

a =
 [1 2 3]
b =
 [[1 2 3]
 [4 5 6]]

2.2 创建随机数组

2.2.1 使用arange和linspace

创建从 start 到 end(不包括 end )的随机数组,step 为间隔或步长。

import numpy as np
a = np.arange(0,1,0.1)
print("a =\n", a)

输出结果:

a =
 [0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

创建从 start 到 end 的随机数组,num 为数组元素的个数。如果想不包括 end 的随机数组,可以在函数内加上endpoint = False

import numpy as np
a = np.linspace(0,1,9)
print("a =\n", a)

输出结果:

a =
 [0.    0.125 0.25  0.375 0.5   0.625 0.75  0.875 1.   ]

2.2.2 使用Numpy下的random模块

创建一个 x 行 y 列的数组,其中每个元素的范围为0~1。

import numpy as np
a = np.random.rand(2,2)
print("a =\n", a)

输出结果:

a =
 [[0.316501   0.79346022]
 [0.63625254 0.5903114 ]]

创建一个 x 行 y 列的数组,其中每个元素符合标准正态分布。

import numpy as np
a = np.random.randn(2,2)
print("a =\n", a)

输出结果:

a =
 [[-0.38680278 -0.08517162]
 [ 2.63588115  0.15942309]]

创建一个 x 行 y 列的数组,其中每个元素的范围为start~end(不包括end)。

import numpy as np
a = np.random.randint(1,10,(2,2))
print("a =\n", a)

输出结果:

a =
 [[2 2]
 [6 5]]

2.3 创建其他类型数组

创建一个 x 行 y 列的数组,其中每个元素都为0。

创建一个 x 行 y 列的数组,其中每个元素都为1。

import numpy as np
a = np.zeros((2,2))
b = np.ones((2,2))
print("a =\n", a)
print("b =\n", b)

输出结果:

a =
 [[0. 0.]
 [0. 0.]]
b =
 [[1. 1.]
 [1. 1.]]

创建形状和a一样且元素全是0的数组

创建形状和a一样且元素全是1的数组

import numpy as np
a = np.random.randn(2,3)
b = np.zeros_like(a)
c = np.ones_like(a)
print("a =\n", a)
print("b =\n", b)
print("c =\n", c)

输出结果:

a =
 [[ 0.41726975  0.54929402  1.0815317 ]
 [ 0.63351294  1.1521574  -0.31667051]]
b =
 [[0. 0. 0.]
 [0. 0. 0.]]
c =
 [[1. 1. 1.]
 [1. 1. 1.]]

2.4 获取数组的参数

假设a为一个使用numpy创建的数组,要想获取它的形状、元素的数据类型、维度该如何操作呢?

import numpy as np
a = np.random.randn(2,3)
print("a.shape =\n", a.shape)
print("a.dtype =\n", a.dtype)
print("a.ndim =\n", a.ndim)

输出结果:

a.shape =  (2, 3)
a.dtype =  float64
a.ndim =  2

2.5 存取数组

2.5.1 一维数组存取

假设我们创建了一个一维数组a,

import numpy as np
a = np.array([4,2,3,5,9,0,6,8,7])

取其中的元素5,可以直接使用a[3]取第4个元素,

print(a[3])

取其中第4个元素和第5个元素,可以采用切片操作a[3:5],注意切片操作不包含末尾的第6个元素,

print(a[3:5])

可以省略开始下标,取前5个元素

print(a[:5])

可以省略末尾下标,取后5个元素

print(a[4:])

可以省略所有下表,取所有元素

print(a[:])

注意如果省略所有下标,可以定义步长(步长为正数表示顺序排列,步长为负数表示倒序排列),例如a[::3]

print(a[::3])
print(a[::-3])

输出结果:

[4 5 6]
[7 0 3]

2.5.2 二维数组存取

二维数组在传统机器学习领域广泛使用,我们采用arange创建一个数组,然后采用reshape方法转化为二维数组,由于python是按照行排列数组,因此转化时也按照行排列。

import numpy as np
a = np.arange(0,25,1).reshape(5,5)
print("a = \n", a)

输出结果:

a = 
 [[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]
 [15 16 17 18 19]
 [20 21 22 23 24]]

对于二维数组进行存取需要同时使用两个维度操作,同时在每一维度上和一维数组操作类似,例如我们取前两行的后两列,可以用a[:2, 3:]

print(a[:2, 3:])

输出结果:

[[3 4]
 [8 9]]

2.5.3 三位数组存取

三位数组广泛使用在深度学习的特征提取中,例如图像的三通道RGB特征。我们创建一个3行4列5通道的数组,

import numpy as np
a = np.ones(60).reshape(3, 4, 5)
print("a = \n", a)

输出结果:

a = 
 [[[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]

 [[1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]
  [1. 1. 1. 1. 1.]]]

有人可能会对python表示的三维数组有些疑惑,下面我们用图示表示一下如何理解三维数组。


三维数组1.png 三维数组2.png 三维数组3.png
上一篇下一篇

猜你喜欢

热点阅读