numpy模块

一、ipython

ipython:交互式的python命令行

安装方法:pip install ipython
tab:键自动完成,会提示和输入相关的所有内置方法或属性等 ?:内省、命名空间搜索,输入的内容跟上?会显示与其相关的介绍、参数等 !:!跟系统命令,就会执行该系统命令
魔术命令:以%开始
     %run:可直接执行一个可执行文件的代码         
     %paste:执行剪切来的代码
     %timeit:评估代码运行时间
     %pdb:自动调试
使用命令历史
获取输入输出结果
目录标签系统
IPython Notebook

常用的魔术命令:

python调试器命令:

二、Numpy:数组计算

NumPy是高性能科学计算和数据分析的基础包,它是pandas等其他各种工具的基础。

NumPy的主要功能:1)ndarray,一个多维数组结构,高效且节省空间
    (2) 无需循环对整组数据进行快速运算的数学函数
    (3)*读写磁盘数据的工具以及用于操作内存映射文件的工具
    (4)*线性代数、随机数生成和傅里叶变换功能
    (5)*用于集成C、C++等代码的工具

安装方法:pip install numpy
引用方法:import numpy as np
Numpy:ndarray-多维数组对象

为什么使用ndarray:
   (1)已知若干家跨国公司的市值(美元),将其换算为人民币
   (2)已知购物车中每件商品的价格与商品件数,求总金额

用python内置方法:
答案:
   (1)
          money=[i*6.3 for i in range(1,100)]
          transform=map(lambda x:x*6.3,range(1,100))
      
      import random
      li = [random.uniform(10,20) for _ in range(1000)]
      ratio = 6.3
      list(map(lambda x:x*ratio, li)) (
2) total=0 test=lambda sum:[i*j for i,j in zip(range(1,4),range(1,4))] for i in test(sum): total+=i print(total)


创建ndarray:np.array()
(1)   import random
      li = [random.uniform(10,20) for _ in range(1000)]
      ratio = 6.3

      arr = np.array(li)*ratio

  (2) p = [random.uniform(10,20) for _ in range(1000)]
      n = [random.randint(1,10) for _ in range(1000)]
    arr_p = np.array(p)
      arr_n = np.array(n)
      total=(arr_p * arr_n).sum()
创建ndarray:np.array()

ndarray是多维数组结构,与列表的区别是:
   (1) 数组对象内的元素类型必须相同
   (2) 数组大小不可修改

常用属性:
    (1)T              数组的转置
    (2)dtype          数组元素的数据类型
    (3)size           数组元素的个数
    (4)ndim           数组的维数
    (5)shape          数组的维度大小(以元组形式)

ndarray数据类型:dtype:
    (1)布尔型:bool_
    (2)整型:int_ int8 int16 int32 int 64
    (3)无符号整型:uint8 uint16 uint32 uint64
    (4)浮点型:float_ float16 float32 float64
    (5)复数型:complex_ complex64 complex128

创建ndarray:

    (1)array()     将列表转换成数组,可选择指定dtype

     (2)arange()     range的numpy版,支持浮点数

     (3)linspace()   类似arange(),第三个参数为数组长度

     (4)zeros()      根据指定形状和dtype创建全0数组

     (5)ones()       根据指定形状和dtype创建全1数组

     (6)empty()      根据指定形状和dtype创建全空数组(随机值,可能是之前遗留的随机值)

     (7)eye()        根据指定边长和dtype创建单位矩阵(最简矩阵)

 

示例:
  import numpy as np
li = [[1,2,3],[4,5,6]]
arr
= np.array(li)

1)arr
array([[
1, 2, 3], [4, 5, 6]])

2)arr.T # 转置

array([[1, 4], [2, 5], [3, 6]])

3)arr.size
6

4)arr.shape

(2, 3) # 2行3列

(5)arr.ndim
2 #二维数组

(6)arr.dtype
dtype('int32')

(7)2**16-1
65535 #16位没有负数可存储的最大数
2**15-1 #16位有负数可存储的最大数


(8)
arr = np.empty(12, dtype='int')
for i in range(len(arr)):
    arr[i] = i
arr
result:array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) #可创建数组

(9)np.arange(3,10,0.3) #[3,10]之间每隔0.3取一个数
result:
array([ 3. , 3.3, 3.6, 3.9, 4.2, 4.5, 4.8,
5.1, 5.4, 5.7, 6. , 6.3, 6.6, 6.9,
7.2, 7.5, 7.8, 8.1, 8.4, 8.7, 9. ,
9.3, 9.6, 9.9])

(10)x=np.linspace(-100,100,10000)
y=x**2
plt.plot(x,y)
plt.show() #能画出二次函数

(11)np.eye(3) #三行三列的最简矩阵
result:
array([[ 1., 0., 0.], [ 0., 1., 0.], [ 0., 0., 1.]])

(12)np.zeros((3,2,4)) #三维二行四列
result:
    array([[[ 0.,  0.,  0.,  0.],
           [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]],

       [[ 0.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  0.]]])
(13)np.arange(15).reshape((3,5))    #将一维数组变为三行五列的二维数组
result:
   array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14]])

(14)arr = np.arange(15, dtype='int') 创建类型为int的一维数组
arr
result: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

(15)arr=np.arange(15,dtype='int') #一维数组
arr.dtype='float32' #只改变解释方式,没有改变数据


(16)arr.astype('float') #将int类型转换成float类型
result: array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9., 10., 11.])
Numpy:
(1)数组和标量之间的运算
a+1 a*3 1//1 a**0.5

(2)同样的大小数组之间的运算
a+b a/b a**b

(3)数组的索引:
一维数组:a[5]
多维数组:
列表式写法:a[2][3]
新式写法:a[2,3] (推荐)

(4)数组的切片:
一维数组:a[5:8] a[4:] a[2:10]
多维数组:a[1:2,3:4] a[:,3:5] a[:,1]

(5)与列表不同,数组切片时不会自动复制,在切片数组上的修改会影响原数组
解决方法:copy()

(6)布尔型索引
question1:给一个数组,选出数组中所有大于5的数
result1:a[a>5]
原理:
  • a>5会对a中的每一个元素进行判断,返回一个布尔数组
  • 布尔型索引:将同样大小的布尔数组传进索引,会返回一个由所有True对应位置

              的元素的数组

question2:给一个数组,选出数组中所有大于5的偶数
result2:a[(a>5)&(a%2==0)]

question3:给一个数组,选出数组中所有大于5的数和偶数
result3:a[(a>5)|(a%2==0)]

(7)花式索引
question1:对于一个数组,选出其第1,3,4,6,7个元素,组成新的二维数组
result1:a[[1,3,4,6,7]]

question2:对于一个二维数组,选出其第一列和第三列,组成新的二维数组
result2:a[:,[1,3]]

(8)通用函数
  • 能同时数组中所有元素进行运算的函数
  • 常见通用函数:

一元函数:abs,sqrt,exp,log,ceil,floor,rint,trunc,modf,isnan,isinf,cos,sin,tan

二元函数:add,substract,multiply,divide,power,mod,maximun,mininum

ceil(向上取整): 3.1 -> 4 -3.1 -> -3

floor(向下取整): 3.1 -> 3 -3.1 -> -4

rint(四舍五入): 3.1 -> 3 3.6 -> 4 -3.1 -> -3 -3.6 -> -4

rint(四舍五入): 3.1 -> 3 3.6 -> 4 -3.1 -> -3 -3.6 -> -4

(9)浮点数特殊值

  • 浮点数:float
  • 浮点数有两个特殊值:

nan(not a number):不等于任何浮点数(nan!=nan),表示数据缺失值

inf(infinity):比任何浮点数都大

(10)数学和统计方法
    常用方法:
        sum     求和

        cumsum  求前缀和

        mean    求平均数

        std     求标准差

        var     求方差

        min     求最小值

        max     求最大值

        argmin  求最小值索引

        argmax  求最大值索引

 

(11)随机数生成

  •  随机数生成函数在np.random子包内
  •  常用函数

      rand       给定形状产生随机数组(0到1之间的数)

     randint    给定形状产生随机整数

     choice     给定数组产生随机选择

     shuffle    与random.shuffle相同

     uniform    给定数组产生随机数组

示例:
numpy索引与切片

(1)
arr = np.arange(20).reshape(4,5)
arr
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])
arr[1,2]
result:7

(2)np.arange(10)[:-1]
result:array([0, 1, 2, 3, 4, 5, 6, 7, 8])

(3)arr[:,1:4]    #取2,3,4列
result:
array([[ 1,  2,  3],
       [ 6,  7,  8],
       [11, 12, 13],
       [16, 17, 18]])

(4)arr[:,1]
result:array([ 1,  6, 11, 16])    取出第一列组成数组

(5)arr = np.arange(5)
       arr
      result:array([0, 1, 2, 3, 4])
      
      brr = arr[3:].copy()
      brr
      result:array([3, 4])
      
      brr[0] = 10
      arr
      result:array([0, 1, 2, 3, 4])

      
(6)
     a = [1,2,3,4,5]
     b = a[:3]
     b[0]=10
     a
     result:[1, 2, 3, 4, 5]

(7)li = [random.randint(0,10) for _ in range(20)]
   li
result:[10, 1, 3, 6, 6, 5, 3, 3, 1,
6, 3, 8, 9, 10, 7, 5, 6, 1, 1, 8] #产生20个在(0,10)之间的随机数

(8)b=arr>5
arr[b]
result: array([10, 6, 6, 6, 8, 9, 10, 7, 6, 8]) 返回数组中大于5的数重新组成的数组

(9) x = np.array([1,2,3,4,5])
x[[True, False,False,True,True]] #返回true位置的数
result:array([1, 4, 5])

(10)arr[~(arr>5)]
result:array([1, 3, 5, 3, 3, 1, 3, 5, 1, 1]) 返回数组中小于5的数重新组成的数组

(11)arr[[1,3,4,6,7]] #魔术索引,返回索引为1,3,4,6,7的一维数组
result:array([1, 6, 6, 3, 3])

(12)arr = np.arange(20).reshape(4,5)
arr
result:array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19]])

arr[:,[1,3]] #取出二维数组的第一列和第四列
result:array([[ 1, 3],
[ 6, 8],
[11, 13],
[16, 18]])

(13)arr[[0,2],[1,3]] #取出第一行第一列的数和第三行第四列的数组成一维数组
result:array([ 1, 13])

(14)arr[[0,2],:][:,[1,3]]
result:array([[ 1, 3], [11, 13]])

(15)arr = np.array([1,-2,3,-4])
np.sqrt(np.abs(arr))
result:array([ 1. , 1.41421356, 1.73205081, 2. ])

(16)
arr = np.arange(0,5,0.2)
np.modf(arr)
result:
(array([ 0. ,  0.2,  0.4,  0.6,  0.8,  0. ,  0.2,  0.4,  0.6,  0.8,  0. ,
         0.2,  0.4,  0.6,  0.8,  0. ,  0.2,  0.4,  0.6,  0.8,  0. ,  0.2,
         0.4,  0.6,  0.8]),

array([ 0., 0., 0., 0., 0., 1., 1., 1., 1., 1., 2., 2., 2., 2., 2., 3.,
3., 3., 3., 3., 4., 4., 4., 4., 4.]))

(17)

a = np.array([6,3,2,1,0])
b = np.array([0,1,2,3,4])
c = a / b

(18)c[~np.isnan(c)]
result:array([ inf, 3. , 1. , 0.33333333, 0. ])

(19)np.maximum(a,b)
result:array([6, 3, 2, 3, 4])

(20)arr.std() #方差表示一组数的离散程度
result:3.4520525295346629

(21)arr = np.array([random.uniform(10,30) for _ in range(10000)])
(arr.mean()-2*arr.std(), arr.mean()+2*arr.std())
result:(8.4985570120388783, 31.752980328736868)

(22)arr = np.arange(100)
arr[10:20].sum()
result:145

(23)b = arr.cumsum()
b[19] - b[9]
result:145

(24)np.median(arr) #中位数
result:49.5

(25)x.min()
result:1

(26)x.argmin()
result:0

(27)np.random.randint(10,20,(3,5))
result:array([[13, 11, 19, 11, 11],
[12, 18, 18, 13, 10],
[19, 16, 12, 19, 10]])

(28)np.random.choice(list('asdfghjgh'),10)
result:array(['s', 'a', 'g', 'd', 's', 'a', 'h', 'h', 'a', 'h'], dtype='<U1')

(29)li = [1,2,3,4,5]
random.shuffle(li)
li
result:[4, 5, 1, 2, 3]

(30)
import matplotlib.pyplot as plt
a = np.random.uniform(10,20,1000000)
plt.hist(a, 100)
plt.show()

(31)
a = np.random.normal(0, 10000, 1000000)
plt.hist(a,100)
plt.show() #正态分布
posted @ 2018-02-02 19:20  星雨5213  阅读(148)  评论(0)    收藏  举报