numpy学习与使用3

下面的代码主要是邹博讲的机器学习中关于python入门的代码,运行环境python2.7

#!/usr/bin/python
# -*- coding: UTF-8 -*-

# 导入NumPy函数库,一般都是用这样的形式(包括别名np,几乎是约定俗成的)
import numpy as np
import matplotlib as mpl
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
import time
from scipy.optimize import leastsq
from scipy import stats
import scipy.optimize as opt
import scipy
import matplotlib.pyplot as plt
from scipy.stats import norm, poisson
# from scipy.interpolate import BarycentricInterpolator
# from scipy.interpolate import CubicSpline
import math


# import seaborn


def residual(t, x, y):
    return y - (t[0] * x ** 2 + t[1] * x + t[2])


def residual2(t, x, y):
    print t[0], t[1]
    return y - t[0] * np.sin(t[1] * x)


# x ** x        x > 0
# (-x) ** (-x)  x < 0
def f(x):
    y = np.ones_like(x)
    i = x > 0
    y[i] = np.power(x[i], x[i])
    i = x < 0
    y[i] = np.power(-x[i], -x[i])
    return y


if __name__ == "__main__":
    # # 开场白:
    # numpy是非常好用的数据包,如:可以这样得到这个二维数组
    # [[ 0  1  2  3  4  5]
    #  [10 11 12 13 14 15]
    #  [20 21 22 23 24 25]
    #  [30 31 32 33 34 35]
    #  [40 41 42 43 44 45]
    #  [50 51 52 53 54 55]]
    a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6)
    print a

    # 正式开始  -:)
    # 标准Python的列表(list)中,元素本质是对象。
    # 如:L = [1, 2, 3],需要3个指针和三个整数对象,对于数值运算比较浪费内存和CPU。
    # 因此,Numpy提供了ndarray(N-dimensional array object)对象:存储单一数据类型的多维数组。

    # # 1.使用array创建
    # 通过array函数传递list对象
    L = [1, 2, 3, 4, 5, 6]
    print "L = ", L
    a = np.array(L)
    print "a = ", a
    print type(a)
    # # # 若传递的是多层嵌套的list,将创建多维数组
    b = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]])
    print "b:\n", b
    # # #
    # # # # 数组大小可以通过其shape属性获得
    print "a的形状:\n", a.shape
    print "b的形状:\n", b.shape
    # # #
    # # # 也可以强制修改shape
    b.shape = 4, 3
    print "b改变形状之后:\n", b
    # # # # 注:从(3,4)改为(4,3)并不是对数组进行转置,而只是改变每个轴的大小,数组元素在内存中的位置并没有改变
    # # #
    # # # 当某个轴为-1时,将根据数组元素的个数自动计算此轴的长度
    b.shape = 2, -1
    print "b改变形状之后:\n", b
    print "b的形状:\n", b.shape
    # # #
    b.shape = 3, 4
    # # # 使用reshape方法,可以创建改变了尺寸的新数组,原数组的shape保持不变
    c = b.reshape((4, -1))
    print "b = \n", b
    print 'c = \n', c
    # #
    # # # 数组b和c共享内存,修改任意一个将影响另外一个
    b[0][1] = 20
    print "b = \n", b
    print "c = \n", c
    # # #
    # # # 数组的元素类型可以通过dtype属性获得
    print "a.dtype:\n", a.dtype
    print "b.dtype:\n", b.dtype
    # # #
    # # # # 可以通过dtype参数在创建时指定元素类型
    d = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.float)
    f = np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12]], dtype=np.complex)
    print "d:\n", d
    print "f:\n", f
    # # #
    # # # 如果更改元素类型,可以使用astype安全的转换
    f = d.astype(np.int)
    print "f更改为int类型后:\n", f
    # #
    # # # 但不要强制仅修改元素类型,如下面这句,将会以int来解释单精度float类型
    # d.dtype = np.int
    # print d
    #
    # 2.使用函数创建
    # 如果生成一定规则的数据,可以使用NumPy提供的专门函数
    # arange函数类似于python的range函数:指定起始值、终止值和步长来创建数组
    # 和Python的range类似,arange同样不包括终值;但arange可以生成浮点类型,而range只能是整数类型
    a = np.arange(1, 10, 0.5)
    print "a:", a
    # # #
    # # # linspace函数通过指定起始值、终止值和元素个数来创建数组,缺省包括终止值
    b = np.linspace(1, 10, 10)
    print 'b = ', b
    # # #
    # # 可以通过endpoint关键字指定是否包括终值
    c = np.linspace(1, 10, 10, endpoint=False)
    print 'c = ', c
    # # #
    # # 和linspace类似,logspace可以创建等比数列
    # # 下面函数创建起始值为10^1,终止值为10^2,有20个数的等比数列
    d = np.logspace(1, 2, 10, endpoint=True)
    print "d:", d
    # # #
    # # # 下面创建起始值为2^0,终止值为2^10(包括),有10个数的等比数列
    f = np.logspace(0, 10, 11, endpoint=True, base=2)
    print "f:", f
    # # #
    # # # 使用 frombuffer, fromstring, fromfile等函数可以从字节序列创建数组
    s = 'abcd'
    g = np.fromstring(s, dtype=np.int8)
    print "g:", g
    # #
    # 3.存取
    # 3.1常规办法:数组元素的存取方法和Python的标准方法相同
    a = np.arange(10)
    print "a:", a
    # # # 获取某个元素
    print "a中的第四个元素a[3]:", a[3]
    # # # # 切片[3,6),左闭右开
    print "a[3:6]:", a[3:6]
    # # # # 省略开始下标,表示从0开始
    print "从0开始到第五个:", a[:5]
    # # # # 下标为负表示从后向前数
    print "从第四个开始:", a[3:]
    # # # # 步长为2
    print "步长为2:", a[1:9:2]
    # # # # 步长为-1,即翻转
    print "倒序输出:", a[::-1]
    # # # # 切片数据是原数组的一个视图,与原数组共享内容空间,可以直接修改元素值
    a[1:4] = 10, 20, 30
    print "切片数据是原数组的一个视图,共享内存:", a
    # # # # 因此,在实践中,切实注意原始数据是否被破坏,如:
    b = a[2:5]
    b[0] = 200
    print "改变b同时也会改变a:", a
    #
    # # 3.2 整数/布尔数组存取
    # # 3.2.1
    # 根据整数数组存取:当使用整数序列对数组元素进行存取时,
    # 将使用整数序列中的每个元素作为下标,整数序列可以是列表(list)或者数组(ndarray)。
    # 使用整数序列作为下标获得的数组不和原始数组共享数据空间。
    a = np.logspace(0, 9, 10, base=2)
    print "a", a
    i = np.arange(0, 10, 2)
    print "i取值左闭右开,间隔为2:", i
    # # # # 利用i取a中的元素
    b = a[i]
    print "通过i取出a中的元素并赋值为b:", b
    # # # b的元素更改,a中元素不受影响
    b[2] = 1.6
    print "修改b中的第三个值:", b
    print "通过数组下标的形式对b进行修改,a并不受影响:", a

    # # 3.2.2
    # 使用布尔数组i作为下标存取数组a中的元素:返回数组a中所有在数组b中对应下标为True的元素
    # # 生成10个满足[0,1)中均匀分布的随机数
    a = np.random.rand(10)
    print "随机生成0-1之间的十个数:", a
    # # # 大于0.5的元素索引
    print "大于0.5元素的索引:", a > 0.5
    # # # # 大于0.5的元素
    b = a[a > 0.5]
    print "将大于0.5元素的赋值给b:", b
    # # # # 将原数组中大于0.5的元素截取成0.5
    a[a > 0.5] = 0.5
    print "将原数组中大于0.5的元素赋值为0.5:", a
    # # # # b不受影响
    print "通过数组下标进行修改,b不受影响:", b

    # 3.3 二维数组的切片
    # [[ 0  1  2  3  4  5]
    #  [10 11 12 13 14 15]
    #  [20 21 22 23 24 25]
    #  [30 31 32 33 34 35]
    #  [40 41 42 43 44 45]
    #  [50 51 52 53 54 55]]
    a = np.arange(0, 60, 10)  # 行向量
    print 'a = ', a
    b = a.reshape((-1, 1))  # 转换成列向量
    print "b =", b
    c = np.arange(6)
    print "c =", c
    f = b + c  # 行 + 列
    print "f:\n", f
    # # 合并上述代码:
    a = np.arange(0, 60, 10).reshape((-1, 1)) + np.arange(6)
    print "a:\n", a
    # # 二维数组的切片
    print a[[0, 1, 2], [2, 3, 4]]
    print a[4, [2, 3, 4]]
    print a[4:, [2, 3, 4]]
    i = np.array([True, False, True, False, False, True])
    print a[i]
    print a[i, 3]

    # # 4.1 numpy与Python数学库的时间比较
    # for j in np.logspace(0, 7, 10):
    #     j = int(j)
    #     x = np.linspace(0, 10, j)
    #     start = time.clock()
    #     y = np.sin(x)
    #     t1 = time.clock() - start
    #
    #     x = x.tolist()
    #     start = time.clock()
    #     for i, t in enumerate(x):
    #         x[i] = math.sin(t)
    #     t2 = time.clock() - start
    #     print j, ": ", t1, t2, t2/t1

    # 4.2 元素去重
    # 4.2.1直接使用库函数
    a = np.array((1, 2, 3, 4, 5, 5, 7, 3, 2, 2, 8, 8))
    print '原始数组:', a
    # # 使用库函数unique
    b = np.unique(a)
    print '去重后:', b
    # # 4.2.2 二维数组的去重,结果会是预期的么?
    c = np.array(((1, 2), (3, 4), (5, 6), (1, 3), (3, 4), (7, 6)))
    print '二维数组', c
    print '去重后:', np.unique(c)
    # # 4.2.3 方案1:转换为虚数
    # # r, i = np.split(c, (1, ), axis=1)
    # # x = r + i * 1j
    # x = c[:, 0] + c[:, 1] * 1j
    # print '转换成虚数:', x
    # print '虚数去重后:', np.unique(x)
    # print np.unique(x, return_index=True)   # 思考return_index的意义
    # idx = np.unique(x, return_index=True)[1]
    # print '二维数组去重:\n', c[idx]
    # # 4.2.3 方案2:利用set
    print '去重方案2:\n', np.array(list(set([tuple(t) for t in c])))

    # # 4.3 stack and axis
    a = np.arange(1, 10).reshape((3, 3))
    b = np.arange(11, 20).reshape((3, 3))
    c = np.arange(101, 110).reshape((3, 3))
    print 'a = \n', a
    print 'b = \n', b
    print 'c = \n', c
    print 'axis = 0 \n', np.stack((a, b, c), axis=0)
    print 'axis = 1 \n', np.stack((a, b, c), axis=1)
    print 'axis = 2 \n', np.stack((a, b, c), axis=2)

下面是上述代码的运行结果

D:\software\Anaconda2\python.exe D:/PycharmProjects/Learn/learn_python/learn_py2.py
[[ 0  1  2  3  4  5]
 [10 11 12 13 14 15]
 [20 21 22 23 24 25]
 [30 31 32 33 34 35]
 [40 41 42 43 44 45]
 [50 51 52 53 54 55]]
L =  [1, 2, 3, 4, 5, 6]
a =  [1 2 3 4 5 6]
<type 'numpy.ndarray'>
b:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
a的形状:
(6L,)
b的形状:
(3L, 4L)
b改变形状之后:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
b改变形状之后:
[[ 1  2  3  4  5  6]
 [ 7  8  9 10 11 12]]
b的形状:
(2L, 6L)
b = 
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
c = 
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
b = 
[[ 1 20  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
c = 
[[ 1 20  3]
 [ 4  5  6]
 [ 7  8  9]
 [10 11 12]]
a.dtype:
int32
b.dtype:
int32
d:
[[ 1.  2.  3.  4.]
 [ 5.  6.  7.  8.]
 [ 9. 10. 11. 12.]]
f:
[[ 1.+0.j  2.+0.j  3.+0.j  4.+0.j]
 [ 5.+0.j  6.+0.j  7.+0.j  8.+0.j]
 [ 9.+0.j 10.+0.j 11.+0.j 12.+0.j]]
f更改为int类型后:
[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]]
a: [1.  1.5 2.  2.5 3.  3.5 4.  4.5 5.  5.5 6.  6.5 7.  7.5 8.  8.5 9.  9.5]
b =  [ 1.  2.  3.  4.  5.  6.  7.  8.  9. 10.]
c =  [1.  1.9 2.8 3.7 4.6 5.5 6.4 7.3 8.2 9.1]
d: [ 10.          12.91549665  16.68100537  21.5443469   27.82559402
  35.93813664  46.41588834  59.94842503  77.42636827 100.        ]
f: [1.000e+00 2.000e+00 4.000e+00 8.000e+00 1.600e+01 3.200e+01 6.400e+01
 1.280e+02 2.560e+02 5.120e+02 1.024e+03]
g: [ 97  98  99 100]
a: [0 1 2 3 4 5 6 7 8 9]
a中的第四个元素a[3]: 3
a[3:6]: [3 4 5]
从0开始到第五个: [0 1 2 3 4]
从第四个开始: [3 4 5 6 7 8 9]
步长为2: [1 3 5 7]
倒序输出: [9 8 7 6 5 4 3 2 1 0]
切片数据是原数组的一个视图,共享内存: [ 0 10 20 30  4  5  6  7  8  9]
改变b同时也会改变a: [  0  10 200  30   4   5   6   7   8   9]
a [  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]
i取值左闭右开,间隔为2: [0 2 4 6 8]
通过i取出a中的元素并赋值为b: [  1.   4.  16.  64. 256.]
修改b中的第三个值: [  1.    4.    1.6  64.  256. ]
通过数组下标的形式对b进行修改,a并不受影响: [  1.   2.   4.   8.  16.  32.  64. 128. 256. 512.]
随机生成0-1之间的十个数: [0.70704467 0.05403818 0.82130496 0.27376133 0.17721051 0.18349462
 0.98946324 0.86439343 0.58051814 0.65541734]
大于0.5元素的索引: [ True False  True False False False  True  True  True  True]
将大于0.5元素的赋值给b: [0.70704467 0.82130496 0.98946324 0.86439343 0.58051814 0.65541734]
将原数组中大于0.5的元素赋值为0.5: [0.5        0.05403818 0.5        0.27376133 0.17721051 0.18349462
 0.5        0.5        0.5        0.5       ]
通过数组下标进行修改,b不受影响: [0.70704467 0.82130496 0.98946324 0.86439343 0.58051814 0.65541734]
a =  [ 0 10 20 30 40 50]
b = [[ 0]
 [10]
 [20]
 [30]
 [40]
 [50]]
c = [0 1 2 3 4 5]
f:
[[ 0  1  2  3  4  5]
 [10 11 12 13 14 15]
 [20 21 22 23 24 25]
 [30 31 32 33 34 35]
 [40 41 42 43 44 45]
 [50 51 52 53 54 55]]
a:
[[ 0  1  2  3  4  5]
 [10 11 12 13 14 15]
 [20 21 22 23 24 25]
 [30 31 32 33 34 35]
 [40 41 42 43 44 45]
 [50 51 52 53 54 55]]
[ 2 13 24]
[42 43 44]
[[42 43 44]
 [52 53 54]]
[[ 0  1  2  3  4  5]
 [20 21 22 23 24 25]
 [50 51 52 53 54 55]]
[ 3 23 53]
原始数组: [1 2 3 4 5 5 7 3 2 2 8 8]
去重后: [1 2 3 4 5 7 8]
二维数组 [[1 2]
 [3 4]
 [5 6]
 [1 3]
 [3 4]
 [7 6]]
去重后: [1 2 3 4 5 6 7]
去重方案2:
[[1 2]
 [5 6]
 [7 6]
 [1 3]
 [3 4]]
a = 
[[1 2 3]
 [4 5 6]
 [7 8 9]]
b = 
[[11 12 13]
 [14 15 16]
 [17 18 19]]
c = 
[[101 102 103]
 [104 105 106]
 [107 108 109]]
axis = 0 
[[[  1   2   3]
  [  4   5   6]
  [  7   8   9]]

 [[ 11  12  13]
  [ 14  15  16]
  [ 17  18  19]]

 [[101 102 103]
  [104 105 106]
  [107 108 109]]]
axis = 1 
[[[  1   2   3]
  [ 11  12  13]
  [101 102 103]]

 [[  4   5   6]
  [ 14  15  16]
  [104 105 106]]

 [[  7   8   9]
  [ 17  18  19]
  [107 108 109]]]
axis = 2 
[[[  1  11 101]
  [  2  12 102]
  [  3  13 103]]

 [[  4  14 104]
  [  5  15 105]
  [  6  16 106]]

 [[  7  17 107]
  [  8  18 108]
  [  9  19 109]]]

Process finished with exit code 0

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值