python常⽤数值处理函数_SciPy基础数据操作函数
2. SciPy基础
SciPy以NumPy为基础,与NumPy⼀样,SciPy有着稳定,成熟,且应⽤⼴泛的数值运算库。⽅便、易于使⽤、专为科学和⼯程设计的python⼯具包,它包括了统计、优化、整合以及线性代数模块、傅⾥叶变换、信号和图像图例,常微分⽅差的求解等。
SciPy官⽅教程很完善,可⾃⾏参考学习。
2.1 scipy.misc模块
misc模块,提供⼀些基本的图像相关的读写函数,可以很轻松的读取本地图像⽂件到Python程序⾥,也可将数据输出到图像⽂件。misc模块⾃带⼀些灰度图像ascent和彩⾊的face图,可以scipy.misc.ascent()直接获取爬楼梯ascent图数据到Python程序⾥,⽤
scipy.misc.face()获取⼀副 raccoon浣熊face图,这两个函数的返回值都是Numpy的ndarray数组。
face图像是个彩⾊图像,其数据是个三维数组,是个1024x768的图像,⽽图像中每个像素的值⼜是⼀个数组,分别对应该像素颜⾊的红、绿、蓝分量。ascent图像是个灰度图像,其数据是个⼆维数组,分别对应图像中每个像素的灰度值。
使⽤ascent图
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc as sm
ascent = sm.ascent()
print ascent.shape
plt.figure()
plt.imshow(ascent)
plt.show()
程序执⾏结果:
(512, 512) # ascent.face
使⽤face图
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc as sm
face = sm.face()
print face.shape
plt.figure()
plt.imshow(face)
plt.show()
程序执⾏结果:
(768, 1024, 3) # face.shape
2.2 图像数据属性
scipy.misc.face()返回的是浣熊的脸的彩⾊图像,是⼀个Numpy的三维数组。
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc as sm
x = np.linspace(1, 5, 5)
print type(x), x
print x.shape, x.ndim, x.dtype
face = sm.face()
print type(face)
print face.shape, face.ndim, face.dtype
程序执⾏结果:
[ 1. 2. 3. 4. 5.]
(5,) 1 float64
(768, 1024, 3) 3 uint8
从程序执⾏结果可以看出,尽管是scipy模块的函数,创建的face是numpy的数组,说明scipy⾥多数使⽤的是numpy对象数据。
2.3 NumPy数组操作函数
2.3.1 unique函数
unique函数可以返回NumPy数组对象⾥的唯⼀值,数组由那些数据组成。意思有点像Python的set。
#coding:utf-8
import numpy as np
import scipy.misc as sm
#⾃⼰实现unique函数
def my_unique(x):
ret = list()
if x.ndim > 1:
x = x.flatten(order='C')
for v in x:
if v not in ret:
ret.append(v)
ret = np.sort(ret)
return ret
y = np.array([1, 3, 2, 1, 4, 2])
print y, "# y"
print np.unique(y), "# unique(y)"
print my_unique(y), "# my_unique(y)"
face = sm.face()
print np.unique(face),"# unique(face)"
print my_unique(face),"# my_unique(face)"
程序执⾏结果:
[1 3 2 1 4 2] # y
[1 2 3 4] # unique(y)
[1 2 3 4] # my_unique(y)
[ 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 25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255] # unique(face)
[ 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 25 26 27 28 29 30 31 32 33 34 35
36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197
198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215
216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233
234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251
252 253 254 255] # my_unique(face)
从np.unique(face)打印的结果可以看出的确灰度图基础数据是由0~255来描述的。
2.3.2 bincount函数
numpy的bincount函数可以统计出数组⾥的从0到数组最⼤值n共n+1个⾃然数出现的次数(数字图像存储的数据都是整数)。基本原理是先出数组⾥的最⼤值,统计0~最⼤值间的所有值出现的次数,函数返回共最⼤值加⼀个数据组成的数组。import numpy as np
import scipy.misc as sm
def mybincount(x):
t = np.max(x) +1
i = 0
ret = np.zeros(t, dtype = np.uint8)
for v in x:
ret[v] += 1
return retpython获取数组长度
ascent = sm.ascent()
print "max of array", np.max(ascent[0]), ', has', len(ascent[0])
b = np.bincount(ascent[0])
print "return array's length", len(b)
print "result", b
c = mybincount(ascent[0])
if (b == c).all():
print "mybincount realized bincount"
print c
程序执⾏结果
max of array 118 , has 512
return array's length 119
result [ 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 2 0 0 1 0 1 1 4 1
0 2 2 0 2 1 1 2 3 2 0 8 2 3 2 2 3 2 6 4 5 0 5 2 3
2 20 8
3 2 1 3 5 2
4 11 9 3 1 1 3 3 1 1 2 10 3 3 2 2
0 1 1 1 2 2 1 24 15 3 28 9 27 3 2 27 7 26 2 1 30 2 26 2 1
6 2 0 0 0 0 1 0 0 0 0 0 0 0 0 22 6 50 3]
mybincount realized bincount
[ 0 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 2 0 0 1 0 1 1 4 1
0 2 2 0 2 1 1 2 3 2 0 8 2 3 2 2 3 2 6 4 5 0 5 2 3
2 20 8
3 2 1 3 5 2
4 11 9 3 1 1 3 3 1 1 2 10 3 3 2 2
0 1 1 1 2 2 1 24 15 3 28 9 27 3 2 27 7 26 2 1 30 2 26 2 1
6 2 0 0 0 0 1 0 0 0 0 0 0 0 0 22 6 50 3]
2.3.3 fromfunction函数
函数的作⽤是依据第⼀个形参(是个函数或lambda表达式)来产⽣⼀个数组。
import numpy as np
def fn(x, y):
print x, "# x"
print y, "# y"
return (x + y) * 3
t = np.fromfunction(fn, (3, 4), dtype=np.uint8)
print "t = ", t
程序的执⾏结果:
[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]]# x
[[0 1 2 3]
[0 1 2 3]
[0 1 2 3]]# y
t = [[ 0 3 6 9]
[ 3 6 9 12]
[ 6 9 12 15]]
从结果可以看出,函数先产⽣shape为(3, 4)的数组x和y,x数组⾥的元素列变化从0~2,y数组的⾏元素值变化从0~3和shape指定值有关。结果是return语句的表达式的值,本质上是x和y数组的表达式值。
2.3.4 put函数
put函数可以将数组的某些值替换成其他值,函数原型如下:
numpy.put(a, ind, v, mode='raise')
a是要修改的函数,ind是a⾥要修改的数值的在数组a⾥的位置信息的列表,⽽v是要被替换成的数据列表,原理是先将a“展开”成⼀维a' = a.flatten(),然后在对a'的ind位置处的数据修改成v⾥的某个值。
import numpy as np
a = np.arange(12).reshape([3, 4])
def myput(x, ind, v):
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论