当前位置:   article > 正文

Python-模块系列-numpy库(三)-列表解析-zip函数-数据构建list-排序-多项式拟合-曲线拟合_numpy zip函数

numpy zip函数


numpy具有非常好的数据操纵能力,本文从数据构建,数据排序,数据拟合和曲线拟合等方面介绍使用numpy。

1.列表解析(列表推导式)

列表解析式是将一个可迭代对象(如列表)转换成另一个列表的工具。在转换过程中,可以指定元素必须符合某一条件,并按照指定的表达式进行转换,才能添加至新的列表中。

语法:
[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])

  • 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

2.zip函数

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]
>>>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

3.从list构建NumPy数组

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.NumPy排序

使用NumPy操作矩阵进行排序有sort函数,argsort函数和lexsort函数。

4.1.sort函数

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

4.2.argsort函数

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不变

4.3.lexsort函数

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
以此类推…
先按后,相同,再按前,返回一个排序后的索引。

4.4.倒序

倒序标签方法

xynp=xynp[::-1];#倒序
  • 1

4.5.指定的列排序

提取第一列的数据,然后按照第一列的索引,重新构建数据。

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)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

5.拟合

5.1多项式拟合

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))
  • 1
  • 2
  • 3
  • 4
  • 5

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()
  • 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

5.2曲线拟合-curve_fit

使用函数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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

6.作者答疑

如有疑问,敬请留言。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/638641
推荐阅读
相关标签
  

闽ICP备14008679号