NumPy学习笔记1

NumPy:一个第三方的Python模块,主要提供数值计算功能,大部分由C语言实现,在处理数组,矩阵等方面比单纯用Python实现快得多,提供了大量的矩阵运算的函数库,是用Python进行数值计算&DM&ML的好工具。

NumPy 的学习,也不能期望一步就都学会了,需要慢慢来吧,里面的内容很多,一次性都学了,不用的话忘得也快。

前提:

安装Python,NumPy,matplotlib,ipython,Scipy等。

导入Numpy模块:

from numpy import *
# import numpy as np

NumPy数组对象:
NumPy的数组对象被称作ndarray,一般存储的都是同质的元素,即数组中元素类型都是一致的。

创建数组:

# 使用list创建一维数组
In [43]: a = array([1, 2, 3, 4, 5])

In [44]: a
Out[44]: array([1, 2, 3, 4, 5])

# 使用list创建二维数组
In [53]: b = array([[1, 2], [3, 4]])

In [54]: b
Out[54]: 
array([[1, 2],
       [3, 4]])

In [58]: c = arange(5)  # 使用arange创建数组

In [59]: c  
Out[59]: array([0, 1, 2, 3, 4])

# 生成2到10之间均匀步长的数组,默认生成50个元素
In [401]: linspace(2, 10)  

# fill将c中的所有元素替换成给定元素
In [405]: c.fill(3)

In [406]: c
Out[406]: array([3, 3, 3, 3, 3])

选择数组元素:

我们可以通过下标获取数组中的元素。

# b = array([[1, 2], [3, 4]]),选择第一行第一个元素
In [55]: b[0, 0]  # 还可以这样b[0][0]
Out[55]: 1

# 选择一行第二个元素
In [56]: b[0, 1]    
Out[56]: 2

# 利用item函数可以完成同样的操作
In [364]: b.item((0, 1))
Out[364]: 2

ndarray对象的一些属性:

# a = array([1, 2, 3, 4, 5])
# 返回数组元素对象类型
In [47]: a.dtype
Out[47]: dtype('int64')

# 数组的维度,m行n列的数组的shape为(m, n)
In [48]: a.shape
Out[48]: (5,)

# 数组中所有单个元素的个数
In [49]: a.size
Out[49]: 5

# 数组中每个元素的字节大小  
In [50]: a.itemsize
Out[50]: 8

# 整个数组所占的空间大小
In [159]: a.nbytes
Out[159]: 40  # a.size * a.itemsize

# 秩
In [52]: a.ndim
Out[52]: 1

# 复数数组
In [165]: b = array([1 + 1.j, 3 + 2.j])
In [166]: b
Out[166]: array([ 1.+1.j,  3.+2.j])

# real
In [167]: b.real
Out[167]: array([ 1.,  3.])

# imag
In [168]: b.imag
Out[168]: array([ 1.,  2.])

# flat属性
In [171]: b
Out[171]: 
array([[0, 1],
       [2, 3]])

In [172]: f = b.flat  # 返回一个扁平迭代器

In [173]: f
Out[173]: 

In [175]: for i in f:
   .....:     print(i)
   .....:     
0
1
2
3

In [176]: f[3]  # 可以按照扁平后的下标进行元素取值
Out[176]: 3

In [180]: b.flat = 7  # flat属性可赋值,赋值后整个数组元素将被覆盖

In [181]: b
Out[181]: 
array([[7, 7],
       [7, 7]])

一维数组的索引和切片:

一维数组的索引和切片和Python很类似:ndarry[start:stop:step]

Out[69]: array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])

In [70]: a[:10:2]
Out[70]: array([0, 2, 4, 6, 8])

多维数组的切片和索引

假设数组b为2 * 3 * 4的三维数组,可看成2层楼,每层3行*4列排列的房间。

In [88]: b
Out[88]: 
array([[[ 0,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  9, 10, 11]],

       [[12, 13, 14, 15],
        [16, 17, 18, 19],
        [20, 21, 22, 23]]])

# 通过三维坐标来选择b中任意一个元素:
In [95]: b[1, 2, 3]  # 选择第1层,第2行,第3个元素
Out[95]: 23

# 可以用冒号`:`进行该维区间元素的选择
In [98]: b[:, 0:2, 0]  # 选择所有楼层,第1和第2行的第1个元素
Out[98]: 
array([[ 0,  4],
       [12, 16]])

# `:`的切片作用同Python list
In [100]: b[0, 1, ::2]  # 选择第1楼层,第2行,间隔1个元素取元素
Out[100]: array([4, 6])

# 多个`:`可以用`...`表示
In [99]: b[..., 0]  # 选择所有楼层,所有行的第1列的元素
Out[99]: 
array([[ 0,  4,  8],
       [12, 16, 20]])

In [101]: b[:, 1]  # 选择所有楼层,第2行的元素
Out[101]: 
array([[ 4,  5,  6,  7],
       [16, 17, 18, 19]])

# 将b中元素反转
In [107]: b[::-1, ::-1, ::-1]  # 反转所有楼层,所有行,以及行中所有元素
Out[107]: 
array([[[23, 22, 21, 20],
        [19, 18, 17, 16],
        [15, 14, 13, 12]],

       [[11, 10,  9,  8],
        [ 7,  6,  5,  4],
        [ 3,  2,  1,  0]]]) 

改变数组的维度

  1. 使用ravel函数,进行数组平展

    In [72]: b
    Out[72]: 
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    
    In [73]: b.ravel()
    Out[73]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    
  2. 使用flatten函数,进行数组展平

    In [74]: b.flatten()
    Out[74]: array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11])
    
  3. 使用reshape函数更改维度,一般用在数组初始化

    In [76]: b.reshape(2, 6)  # 不改变b数组
    Out[76]: 
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    
  4. 使用元组设置维度

    In [78]: b.shape = (2, 6)
    
    In [79]: b
    Out[79]: 
    array([[ 0,  1,  2,  3,  4,  5],
           [ 6,  7,  8,  9, 10, 11]])
    
  5. 使用转置函数transpose,或者它的另一种形式darray.T

    In [81]: b.transpose() # 或 b.T
    Out[81]: 
    array([[ 0,  6],
           [ 1,  7],
           [ 2,  8],
           [ 3,  9],
           [ 4, 10],
           [ 5, 11]])
    
  6. 使用resize函数,功能同reshape,但是改变数组

    In [85]: b.resize((3, 4))
    
    In [86]: b
    Out[86]: 
    array([[ 0,  1,  2,  3],
           [ 4,  5,  6,  7],
           [ 8,  9, 10, 11]])
    

组合数组

NumPy数组之间有很多组合的方式。

假设我们有数组a,b

In [115]: a
Out[115]: 
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

In [116]: b
Out[116]: 
array([[ 0,  2,  4],
       [ 6,  8, 10],
       [12, 14, 16]])
  1. 水平组合

    In [118]: hstack((a, b))
    Out[118]: 
    array([[ 0,  1,  2,  0,  2,  4],
           [ 3,  4,  5,  6,  8, 10],
           [ 6,  7,  8, 12, 14, 16]])
    
    In [119]: concatenate((a, b), axis=1)  # axis设为0时即为下方垂直组合的效果
    Out[119]: 
    array([[ 0,  1,  2,  0,  2,  4],
           [ 3,  4,  5,  6,  8, 10],
           [ 6,  7,  8, 12, 14, 16]])
    
  2. 垂直组合

    In [120]: vstack((a, b))
    Out[120]: 
    array([[ 0,  1,  2],
           [ 3,  4,  5],
           [ 6,  7,  8],
           [ 0,  2,  4],
           [ 6,  8, 10],
           [12, 14, 16]])
    
  3. 深度组合

    In [121]: dstack((a, b))
    Out[121]: 
    array([[[ 0,  0],
            [ 1,  2],
            [ 2,  4]],
    
           [[ 3,  6],
            [ 4,  8],
            [ 5, 10]],
    
           [[ 6, 12],
            [ 7, 14],
            [ 8, 16]]])
    
  4. 列组合

    In [122]: column_stack(([0, 0], [1, 2]))
    Out[122]: 
    array([[0, 1],
           [0, 2]])
    
  5. 行组合

    In [123]: row_stack(([0, 0], [1, 2]))
    Out[123]: 
    array([[0, 0],
           [1, 2]])
    

数组的分割

  1. 水平分割

    In [138]: a
    Out[138]: 
    array([[0, 1, 2],
           [3, 4, 5],
           [6, 7, 8]])
    
    In [139]: hsplit(a, 3)  # 将a沿着水平方向分割为3个大小相同的子数组
    Out[139]: 
    [array([[0],
            [3],
            [6]]), array([[1],
            [4],
            [7]]), array([[2],
            [5],
            [8]])]
    
    In [145]: split(a, 3, axis=1)  # axis设为0时即为下面的垂直分割
    Out[145]: 
    [array([[0],
            [3],
            [6]]), array([[1],
            [4],
            [7]]), array([[2],
            [5],
            [8]])]      
    
  2. 垂直分割

    In [147]: vsplit(a, 3)
    Out[147]: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
    
  3. 深度分割

    In [156]: b
    Out[156]: 
    array([[[ 0,  1,  2],
            [ 3,  4,  5]],
    
           [[ 6,  7,  8],
            [ 9, 10, 11]]])
    
    In [157]: dsplit(b, 3)  # dsplit函数只能作用在3维或以上的数组上
    Out[157]: 
    [array([[[0],
             [3]],
    
            [[6],
             [9]]]), array([[[ 1],
             [ 4]],
    
            [[ 7],
             [10]]]), array([[[ 2],
             [ 5]],
    
            [[ 8],
             [11]]])]
    

数组比较==

# 将进行数组中元素的一一比较
In [129]: c == d
Out[129]: array([ True, False], dtype=bool)

数组的转换

In [183]: b.tolist()  # 转换成list
Out[183]: [[7, 7], [7, 7]]      

In [186]: b.astype(float)  # 将原数组元素类型更改为float类型
Out[186]: 
array([[ 7.,  7.],
       [ 7.,  7.]])

你可能感兴趣的:(Python,科学计算)