Python_Tips[1]
Find替代函数
matlab里面的find真的是很方便,与find对应的在python.numpy里面, 有where函数,但是感觉能力有限,不太方便。
比如matlab中,
a[a>6]=6
或者
label=find(a>6)
a[label]=6
可以轻松替换掉大于6的数字。
label[1]找到第一个大于6的值得标号
而在python中,今天看到一个好方法,
import numpy as np
a=np.random.rand(4,5)
对象是array的话
也是可以
a[a>0.5]=1
也可以
a[nonzero(a>0.5)]=1
找某行第一次超过某值的标号
labels=nonzero(a[:,0]>0.7)[0][0]
nonzero返回的是n维度的矩阵,对应于a的n维,上文的[0][0]代表第一维的第一个值。
数据的一般处理
fr = open(fileName)
stringArr = [line.strip().split(delim) for line in fr.readlines()]
#str.strip()去除首尾的空格还包括最后讨厌的回车哦
#str.split(',')以,号分隔,返回分隔后的字符串列表
#还可以添加一些if条件语句去除空行, 如if line.strip()==''
datArr = [map(float,line) for line in stringArr]
#map函数可以批量将字符矩阵映射到想要的类型上。以前不知道,搞得很麻烦。
#但这里注意stringArr是一个二维列表哦,才能这样做。一维的直接map就可以了。
fr.close()
#然后就有了准备好的矩阵,好开心。
画图的一般步骤
一开始并不知道面向对象语言是怎么画图的
import matplotlib
import matplotlib.pyplot as plt
fig = plt.figure(1)
#一开始建立一个画板句柄
ax = fig.add_subplot(111)
#建立子图的句柄,
ax.scatter(dataMat[:,0], dataMat[:,1], marker='^', s=90)
#画散点图,变量x,y
fig = plt.figure(2)
#再画一张图
ax2 = fig.add_subplot(111)
ax2.scatter(dataMat[:,0], dataMat[:,1], marker='^', s=900)
ax2.scatter(reconMat[:,0],reconMat[:,1],marker='o', s=50, c='red')
plt.show()
#有且只能一起展示出来