Python数据分析之Numpy&Panadas使用

本文中是对Numpy和Panadas使用的总结。
Numpy是c语言写的,Panadas是基于Numpy的升级版本。

使用矩阵计算,所以速度很快。在神经网络中也会运用到Panadas和Numpy的使用。

##安装
mac用户使用安装:
sudo pip install numpy
win用户可以安装anacoda。

Numpy基本属性

numpy是基于矩阵的运算。
一维的是序列,[1,2,4], 多行的是矩阵。
矩阵:一维或者多维的数组。

[[1,2,3],
 [4,5,6]]

列表转换为矩阵

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
34
35
36

In [4]: array = np.array([[1,2,3],
[4,5,6]])

In [11]: type(array)
Out[11]: numpy.ndarray


In [5]: array
Out[5]: # 输出的是个矩阵
array([[1, 2, 3],
[4, 5, 6]])

### ndim 维数
In [6]: array.ndim # 输出的2维
Out[6]: 2

### shape 矩阵的形状(行数和列数)

In [7]: array.shape # 2行3列
Out[7]: (2, 3)

### size 元素个数

In [10]: array.size
Out[10]: 6

### 创建矩阵和数组

#### dtype
dtype指定创建的矩阵类型:
In [3]: a = np.array([1,2,4], dtype=np.int)

In [4]: a.dtype
Out[4]: dtype('int32')
```该是版本的问题,直接使用的dtype=int创建出来的是32位的数字而不是64位

也可以指定float类型:dtype=np.float32或者dtype=np.float。后面的数字是位数,位数越大的,占用的空间越大,精度越大;位数越小的精度越小,但是占用空间越小。
numpy中有很多的类型,自行谷歌吧。

全为0或者1的矩阵

使用zeros方法:
In [15]: a = np.zeros((4,5), dtype=np.int16) # 注意2层括号

In [16]: a
Out[16]:
array([[ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.]])

创建全为1的矩阵同理,使用ones()方法。

a = np.empty((3,4))
# 生成的是几乎接近为0的数字矩阵。

生成有序序列:

arange指定的是个数,reshape指定行列数。
In [18]: a = np.arange(100).reshape((10,10))
In [19]: a
Out[19]:
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, 24, 25, 26, 27, 28, 29],
[30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
[40, 41, 42, 43, 44, 45, 46, 47, 48, 49],
[50, 51, 52, 53, 54, 55, 56, 57, 58, 59],
[60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
[70, 71, 72, 73, 74, 75, 76, 77, 78, 79],
[80, 81, 82, 83, 84, 85, 86, 87, 88, 89],
[90, 91, 92, 93, 94, 95, 96, 97, 98, 99]])

生成线段:
np.linspace(1, 20, 5):在1到20之间生成5段数字。会自动的进行分隔。
In [20]: m = np.linspace(1, 20, 5)

In [21]: m
Out[21]: array([  1.  ,   5.75,  10.5 ,  15.25,  20.  ])

同样可以再后面加上reshape方法,指定形成的矩阵行列数。

numpy基础运算

对于加减乘逻辑运算是相同的形式:

In [34]: a = np.array([10,20,30,40])

In [35]: b = np.arange(5)

In [36]: a
Out[36]: array([10, 20, 30, 40])

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

a + b
a - b
a * b
a**2 # a的平方

使用sin或者cos或者tan需要np.sin或者np.cos方法等
In [44]: c = 10*np.sin(a)

In [45]: c
Out[45]: array([-5.44021111,  9.12945251, -9.88031624,  7.4511316 ])

比较矩阵中数字返回的是布尔值:

In [51]: b
Out[51]: array([0, 1, 2, 3, 4, 5])

In [52]: b>4     或者b<4 或者 b==4 等于要用双等于,
Out[52]: array([False, False, False, False, False,  True], dtype=bool)

矩阵中乘法运算:

  1. 一对一的相乘:
    In [57]: b
    Out[57]: array([0, 1, 2, 3])

    In [58]: a
    Out[58]: array([10, 20, 30, 40])

    In [59]: b*a
    Out[59]: array([ 0, 20, 60, 120])

  2. 使用矩阵相乘:

    In [98]: a = np.array([[1,2],[4,5]])
    In [99]: a
    Out[99]:
    array([[1, 2],

    [4, 5]])
    

    In [100]: b = np.arange(4).reshape((2,2))
    In [101]: b
    Out[101]:
    array([[0, 1],

    [2, 3]])
    

    In [102]: np.dot(a,b) # 方法1
    Out[102]:
    array([[ 4, 7],

    [10, 19]])
    

    In [103]: a.dot(b) # 方法2
    Out[103]:
    array([[ 4, 7],

    [10, 19]])
    

随机生成数的矩阵

随机生成的是0到1数字:
In [104]: m = np.random.random((2,4)) # shape,2行4列

In [105]: m
Out[105]:
array([[ 0.84860133,  0.06700202,  0.94674506,  0.72577269],
       [ 0.99062033,  0.70405729,  0.45466221,  0.8595076 ]])

矩阵中数字运算

矩阵 a
axis=1 是每列的运算结果
axis=0是每行的运算结果
矩阵中所有数字求和:np.sum(a,axis=1)
矩阵中所有数字求最小值:np.min(a, axis=0)
矩阵中所有数字求最大值:np.max(a)

找出矩阵中最大或者最小的索引:np.argmin(a) np.argmax(a)
矩阵数字的平均值:np.mean(a, axis=1 or 0) 或者a.mean() np.average(a),同样可以加上axis=1或者0的属性
求中位数: np.median(a)
逐步累加: np.cumsum(a)
逐步累差: np.diff(a)
找出非0的数字:np.norzero(a) # 不清楚
逐行排序:np.sort(a)
行列反转:np.transpose(a) 行转换为列,列转换为行
截取矩阵中某些数字: np.clip(a,min_number, max_number) # 大于 max_number的数字都变为max_number,小于min_number的数字都变为min_number

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

In [108]: np.median(a)
Out[108]: 3.0

In [109]: np.cumsum(a)
Out[109]: array([ 1,  3,  7, 12], dtype=int32)

In [110]: np.diff(a)
Out[110]:
array([[1],
       [1]])

# 将a矩阵反转之后在和原矩阵相乘
In [112]: np.transpose(a).dot(a) 
Out[112]:
array([[17, 22],
       [22, 29]])

矩阵数字索引

In [116]: r = np.arange(3,15).reshape((3,4))

In [117]: r
Out[117]:
array([[ 3,  4,  5,  6],
       [ 7,  8,  9, 10],
       [11, 12, 13, 14]])

In [118]: r[2][3] or r[2,3] 都是相同的作用
Out[118]: 14

In [119]: r[2,3]
Out[119]: 14

[120]: r[2]            # 取出的是行索引值为2的
Out[120]: array([11, 12, 13, 14])

In [121]: r[:,2] # 取出列索引值为2的,前面的冒号是代表行
Out[121]: array([ 5,  9, 13])

In [122]: r[1, 1:4]    # 出去第一行,第一列到第3列的数字。
Out[122]: array([ 8,  9, 10])

迭代矩阵的列和行:
numpy中只有行的迭代,没有列的迭代,但是可以先将矩阵转换,再for出来。
In [123]: for row in r:
…: print(row)
…:
[3 4 5 6]
[ 7 8 9 10]
[11 12 13 14]

# 列的迭代
In [124]: for col in r.T:
     ...:     print(col)
     ...:
[ 3  7 11]
[ 4  8 12]
[ 5  9 13]
[ 6 10 14]

迭代每个数字

In [125]: r.flatten()  # 将矩阵转为一维的
Out[125]: array([ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14])

In [126]: for x in r.flat:    # 使用后flat方法
     ...:     print(x)
     ...:
3
4
5
6
7
8
9
10
11
12
13
14

降维

直接使用reshape()方法也行

In [127]: r
Out[127]:
array([[ 3,  4,  5,  6],
       [ 7,  8,  9, 10],
       [11, 12, 13, 14]])

In [128]: r.reshape(2,6)
Out[128]:
array([[ 3,  4,  5,  6,  7,  8],
       [ 9, 10, 11, 12, 13, 14]])

合并矩阵

In [135]: a     # 序列
Out[135]: array([1, 2, 3])

In [136]: b    # 序列
Out[136]: array([4, 5, 6])

In [137]: np.vstack((a,b))  # vertical stack 上下的合并
Out[137]:    # 合并之后是矩阵
array([[1, 2, 3],
       [4, 5, 6]])

In [138]: np.hstack((a,b))    # 左右合并 horizontal stack
Out[138]: array([1, 2, 3, 4, 5, 6]) # 序列

如果是序列,使用transport是没用的。