2. Scipy Tutorial-常用函数

本章主要介绍一些Scipy里的常用的函数,例如构造数组的函数。

2.1 拼接array数组

在scipy里常先用numpy模块构造一些array数组,然后对这些数组进行相应的计算和算法处理。

  • concatenate函数。连接若干个序列数据成为一个array数组。
import numpy as np
a1 = np.concatenate(([3], [8] * 4, np.arange(1, 6)))
print a1

程序执行结果:

[3 8 8 8 8 1 2 3 4 5]

concatenate函数有个形参axis,如果没有使用这个参数(axis = None)函数执行结果是一个1维的数组。如果指定了axis的值,那么参与连接的两个array数组按轴来对齐。

对于axis轴的作用的理解: 1). axis使用0值表示沿着每一列或行标签\索引值向下执行方法 2). axis使用1值表示沿着每一行或者列标签模向执行对应的方法

import numpy as np
a1 = np.concatenate(([3], [8] * 4, np.arange(1, 6)))
print a1
x1 = np.array([[1,2,3],[4,5,6]])
x2 = np.array([[11,12,13],[14,15,16]])
#print x1
#print x2
a11 = np.concatenate((x1,x2), axis = 0)
print a11
a12 = np.concatenate((x1,x2), axis = 1)
print a12
a13 = np.concatenate((x1,x2), axis = None)
print a13

程序执行结果:

[3 8 8 8 8 1 2 3 4 5]
[[ 1  2  3] # axis = 0
 [ 4  5  6]
 [11 12  13]
 [14 15 16]] # axis = 1
[[ 1  2  3 11 12 13]
 [ 4  5  6 14 15 16]]
[ 1  2  3  4  5  6 11 12  13 14 15 16] # axis = None
  • r_命令,0轴方向(向下行变)连接各个array数组成更大的数组,即最外层的元素个数增加。作用和concatenate函数差不多。
import numpy as np
a1 = np.concatenate(([3], [8] * 4, np.arange(1, 6)))
print a1
a2 = np.r_[[3], [8] * 4, np.arange(1, 6)]
print a2

程序执行结果:

[3 8 8 8 8 1 2 3 4 5]
  • c_命令。要求列数相同,1轴方向(向右列变)连接各个数组,即内层的元素个数增加。
import numpy as np
a1 = np.concatenate(([3], [8] * 4, np.arange(1, 6)))
print a1
a2 = np.r_[[3], [8] * 4, np.arange(1, 6)]
print a2
a3 = np.c_[[3, 4, 5, 6, 7], [8] * 5, np.arange(1, 6)]
print a3

程序执行结果:

[3 8 8 8 8 1 2 3 4 5] # a1
[3 8 8 8 8 1 2 3 4 5] # a2
[[3 8 1] # a3
 [4 8 2]
 [5 8 3]
 [6 8 4]
 [7 8 5]]
  • r_和c_官方文档里说r_是沿第一轴first axis连接、c_是沿second axis,对于一个具体的数组有0、1、2、...等轴,那么0轴为fisrt axis,1轴为second axis。难懂,更多情况下使用vstack和hstack更容易理解。

import numpy as np
x1 = np.array([[1,2,3],[4,5,6]])
x2 = np.array([[11,12,13],[14,15,16]])
x3 = np.array([[21,22,23],[24,25,26]])
x4 = np.array([[31,32,33],[34,35,36]])
a2 = np.r_[[3,4,5,6], [8] * 4, np.arange(1, 5)]
print a2
a2 = np.c_[[3,4,5,6], [8] * 4, np.arange(1, 5)]
print a2
a21 = np.r_[x1, x2, x3,x4]
print a21
a21 = np.c_[x1, x2, x3,x4]
print a21
print "*" * 20
x1 = np.array(np.arange(1,25).reshape((2, 4, 3)))
x2 = np.array(np.arange(101,125).reshape((2, 4, 3)))
x3 = np.array(np.arange(201,225).reshape((2, 4, 3)))
x4 = np.array(np.arange(301,325).reshape((2, 4, 3)))
print "x1"
print x1.shape,np.shape(x1)
print x1
print "*" * 20
print "a2r"
a2r = np.r_[x1, x2, x3,x4]
print a2r.shape
print a2r
print "*" * 20
print "a2c"
a2c = np.c_[x1, x2, x3,x4]
print a2c.shape
print a2c

程序执行结果:

[3 4 5 6 8 8 8 8 1 2 3 4]
[[3 8 1]
 [4 8 2]
 [5 8 3]
 [6 8 4]]
[[ 1  2  3]
 [ 4  5  6]
 [11 12 13]
 [14 15 16]
 [21 22 23]
 [24 25 26]
 [31 32 33]
 [34 35 36]]
[[ 1  2  3 11 12 13 21 22 23 31 32 33]
 [ 4  5  6 14 15 16 24 25 26 34 35 36]]
********************
x1
(2, 4, 3) (2, 4, 3)
[[[ 1  2  3]
  [ 4  5  6]
  [ 7  8  9]
  [10 11 12]]

 [[13 14 15]
  [16 17 18]
  [19 20 21]
  [22 23 24]]]
********************
a2r
(8, 4, 3)
[[[  1   2   3]
  [  4   5   6]
  [  7   8   9]
  [ 10  11  12]]

 [[ 13  14  15]
  [ 16  17  18]
  [ 19  20  21]
  [ 22  23  24]]

 [[101 102 103]
  [104 105 106]
  [107 108 109]
  [110 111 112]]

 [[113 114 115]
  [116 117 118]
  [119 120 121]
  [122 123 124]]

 [[201 202 203]
  [204 205 206]
  [207 208 209]
  [210 211 212]]

 [[213 214 215]
  [216 217 218]
  [219 220 221]
  [222 223 224]]

 [[301 302 303]
  [304 305 306]
  [307 308 309]
  [310 311 312]]

 [[313 314 315]
  [316 317 318]
  [319 320 321]
  [322 323 324]]]
********************
a2c
(2, 4, 12)
[[[  1   2   3 101 102 103 201 202 203 301 302 303]
  [  4   5   6 104 105 106 204 205 206 304 305 306]
  [  7   8   9 107 108 109 207 208 209 307 308 309]
  [ 10  11  12 110 111 112 210 211 212 310 311 312]]

 [[ 13  14  15 113 114 115 213 214 215 313 314 315]
  [ 16  17  18 116 117 118 216 217 218 316 317 318]
  [ 19  20  21 119 120 121 219 220 221 319 320 321]
  [ 22  23  24 122 123 124 222 223 224 322 323 324]]]
  • vstack和hstack分别为竖排(行数增加、列数不变)、横排(行数不变、列数增加)。
import numpy as np
x1 = np.array([[1,2,3],[4,5,6]])
x2 = np.array([[11,12,13],[14,15,16]])
a3 = np.hstack((x1, x2))
print a3
a4 = np.vstack((x1, x2))
print a4
a5 = np.hstack(([3, 4, 5, 6, 7], [8] * 5, np.arange(1, 6)))
print a5
a6 = np.vstack(([3, 4, 5, 6, 7], [8] * 5, np.arange(1, 6)))
print a6

程序执行结果

[[ 1  2  3 11 12 13] 
 [ 4  5  6 14 15 16]] #a3
[[ 1  2  3]
 [ 4  5  6]
 [11 12 13]
 [14 15 16]]#a4
[3 4 5 6 7 8 8 8 8 8 1 2 3 4 5] #a5
[[3 4 5 6 7]
 [8 8 8 8 8]
 [1 2 3 4 5]] #a6

2.2 mgrid函数

mgrid函数可以产生2D平面上的坐标点数据组成的矩阵。

import numpy as np
import matplotlib.pyplot as plt
a = np.mgrid[0:3, 3:7]
print "a[0]\n", a[0]
print "a[1]\n", a[1]
plt.scatter(a[0], a[1])
plt.show()

执行结果: 如果步长是复数来表示nj,意思是平均取n个点并含有stop即终点。

import numpy as np
import matplotlib.pyplot as plt
a = np.mgrid[0:3:7j, 3:7]
print "a[0]\n", a[0]
print "a[1]\n", a[1]
plt.scatter(a[0], a[1])
plt.show()

执行结果: