赞
踩
列表解析式是将一个可迭代对象(如列表)转换成另一个列表的工具。在转换过程中,可以指定元素必须符合某一条件,并按照指定的表达式进行转换,才能添加至新的列表中。
语法:
[expression for iter_var in iterable1]
[expression for iter_var2 in iterable2 … for iter_varN in iterableN]
[expression for iter_var in iterable1 if condition]
执行:
迭代iterable中所有的元素,每一次迭代都把iterable中的内容放到iter_var对象中,然后把这个对象应用到表达式expression中,生成一个列表。
范例代码如下所示;
#例1,如果我们需要0~100所有偶数组成的列表 a=[x for x in range(101) if x%2==0] #例2,获取文本中所有单词的第1个字符 first_charts=[word[0] for word in text.split()] #例3,使用列表推导式实现嵌套列表的平铺 vec = [[1,2,3],[4,5,6],[7,8,9]] list = [num for elem in vec for num in elem] print(list) #结果[1, 2, 3, 4, 5, 6, 7, 8, 9] ''' 在这个列表推导式中有两个循环,其中第一个循环为外循环,执行得慢; 第二个循环为内循环,执行得快。 ''' #用循环实现其等价写法: vec = [[1,2,3],[4,5,6],[7,8,9]] result= [] for elem in vec: for num in elem: result.append(num) print(result) #例4,列表推导式中可以使用函数或复杂表达式 def f(v): if v%2 == 0: v *= 2 else: v += 1 return v print([f(v) for v in [-1,0,1,2,3] if v > 0]) print([v*2 if v%2==0 else v+1 for v in [-1,0,1,2,3] if v > 0])
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表。如果各个迭代器的元素个数不一致,则返回列表长度与最短的对象相同,利用 * 号操作符,可以将元组解压为列表。
>>> a = [1,2,3] >>> b = [4,5,6] >>> c = [4,5,6,7,8] >>> zipped = zip(a,b) # 返回一个对象 >>> zipped <zip object at 0x103abc288> >>> list(zipped) # list() 转换为列表 [(1, 4), (2, 5), (3, 6)] >>> list(zip(a,c)) # 元素个数与最短的列表一致 [(1, 4), (2, 5), (3, 6)] >>> a1, a2 = zip(*zip(a,b)) # 与 zip 相反,zip(*) 可理解为解压,返回二维矩阵式 >>> list(a1) [1, 2, 3] >>> list(a2) [4, 5, 6] >>>
NumPy本身可以非常方便的构建一系列零矩阵,一矩阵,对称矩阵等,但是经常使用python内建数据结构的读者可能不大熟悉,也可以通过list构建,然后再转为NumPy数据,如下所示:
linePtX=[x for x in range(10)];
linePtY=[y*y for y in range(10)];
xy=list(zip(linePtX,linePtY));
xynp = np.array(xy);#直接用list构建二维矩阵
fig, ax = plt.subplots()
ax.plot(xynp[:, 0], xynp[:, 1], 'b+-')
plt.show()
使用NumPy操作矩阵进行排序有sort函数,argsort函数和lexsort函数。
numpy.sort(a, axis=1, kind=‘quicksort’, order=None)
a :所需排序的数组
axis:数组排序时的基准,axis=0按行排列;axis=1按列排列
kind:数组排序时使用的方法,其中:kind=′quicksort′为快排;kind=′mergesort′为混排;kind=′heapsort′为堆排;
order:一个字符串或列表,可以设置按照某个属性进行排序
作用效果:对数组a排序,排序后直接改变了a
linePtX=[x for x in range(10)];
xnp = np.array(linePtX);
xnp.sort();
xnp =xnp [::-1];#倒序
fig, ax = plt.subplots()
ax.plot(linePtX, xnp [:, 1], 'b+-')
plt.show()
numpy.argsort(a, axis=1, kind=‘quicksort’, order=None)
a :所需排序的数组
axis:数组排序时的基准,axis=0按行排列;axis=1按列排列
kind:数组排序时使用的方法,其中:kind=′quicksort′为快排;kind=′mergesort′为混排;kind=′heapsort′为堆排;
order:一个字符串或列表,可以设置按照某个属性进行排序
作用效果:对数组a排序,返回一个排序后索引,a不变
numpy.argsort((b,a,…), axis=-1, kind=‘quicksort’, order=None)
b在前,a在后,即是先按照a的元素进行比较
如a中的最小值为两个1,其索引分别为0,2,再计较b中相应索引上的值,即9,0
对应的最小应是:1,0,而其对应的索引为2,所以排序后返回的结果第一个值为索引2
下一个最小应是:1,9,而其对应的索引为0,所以排序后返回的结果第一个值为索引0
以此类推…
先按后,相同,再按前,返回一个排序后的索引。
倒序标签方法
xynp=xynp[::-1];#倒序
提取第一列的数据,然后按照第一列的索引,重新构建数据。
import numpy as np
data = np.array(
[[1,2],
[5,3],
[4,6],
[7,5],
[9,0]])
data = data[np.argsort(data[:,0])]
print(data)
numpy的多项式拟合涉及两个函数polyfit和poly1d。
1.polyfit函数
numpy.polyfit(x, y, deg, rcond=None, full=False, w=None, cov=False)
参数:
x: 数组
y: 数组
deg: int,拟合多项式的次数
rcond: 浮点数,可选,拟合的相对条件数。
full: 布尔型,可选,开关确定返回值的性质。当它为 False(默认值)时,仅返回系数,当还返返回自奇异值分解的 True 诊断信息时。
估计方差
2.poly1d函数
参数1:为一个数组,若没有参数2,则生成一个多项式。
范例代码如下所示:
x = np.array([-1,0,1]) #x坐标
y = np.array([1,0,1])
f1 = np.polyfit(x,y,2) # f1是拟合后的多项式的系数,是一个array,degree从高到低排列
p = np.poly1d(f1) # p是二项式的函数,可以带入x进行计算
print(p(1))
3.综合范例
import numpy as np import matplotlib.pyplot as plt import scipy.optimize as optimize def test(hsvlist): hsvlistnp = np.array(hsvlist) xindex=2; yindex=xindex+3; xlist=hsvlistnp[:, xindex]; ylist=hsvlistnp[:, yindex]; hsvlistnp = hsvlistnp[np.argsort(xlist)]#按列排序 xlist = hsvlistnp[:, xindex]; ylist = hsvlistnp[:, yindex]; #拟合 fl = np.polyfit(xlist, ylist, 1); pl = np.poly1d(fl); print(pl); #结果 fly = [pl(x) for x in xlist]; fig, ax = plt.subplots() ax.plot(xlist, ylist, 'b+-') ax.plot(xlist, fly, 'r+-') plt.show()
使用函数curve_fit进行非线性曲线拟合。
import matplotlib.pyplot as plt from scipy.optimize import curve_fit import numpy as np x = np.arange(1, 17, 1) y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60]) def func(x,a,b): return a*np.exp(b/x) popt, pcov = curve_fit(func, x, y) a=popt[0]#popt里面是拟合系数,读者可以自己help其用法 b=popt[1] yvals=func(x,a,b) plot1=plt.plot(x, y, '*',label='original values') plot2=plt.plot(x, yvals, 'r',label='curve_fit values') plt.xlabel('x axis') plt.ylabel('y axis') plt.legend(loc=4)#指定legend的位置,读者可以自己help它的用法 plt.title('curve_fit') plt.show() plt.savefig('p2.png')
如有疑问,敬请留言。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。