Numpy 使用入门

为什么要使用Numpy

    numpy是采用c语言编写的数据分析模块,消耗资源少、采用的是矩阵运算,比python自带的字典或者列表快很多。

Numpy应该怎么安装呢

    一般通过命令行即可安装:

    sudo pip3 install numpy(采用python3版本)

    sudo pip install numpy(采用python2版本)

Numpy基本属性

ndim、shape、size

首先要在python中导入numpy模块

>>> import numpy as np(一般都简称为np)

并赋值一个列表,并且转化为矩阵:

>>> a = np.array([[1,2,3],[2,3,4]])

>>> print(a)

“””

array([[1, 2, 3],

       [2, 3, 4]])

“””

>>> print(‘number of the dim: ’, a.ndim)

#number of the dim:  2

>>> print(‘shape: ’, a.shape)

#shape: (2,3)

>>> print(‘size: ’, a.size)

#size: 6

Numpy创建array的方法

首先,创建array可以采用常规的方法:

a = np.array([2,23,4])

print (a)

#[2,23,4]

此时,创建出来的一维矩阵中数据的类型为int型,如果需要浮点型则需要单独设置dtype值:

>>> a = np.array([2,23,4], dtype = np.int)

>>> print (a.dtype)

#int 64

>>> a = np.array([2,23,4], dtype = np.int32)

>>> print (a.dtype)

#int 32

>>> a = np.array([2,23,4], dtype = np.float)

>>> print (a.dtype)

#float 64

>>> a = np.array([2,23,4], dtype = np.float32)

>>> print (a.dtype)

#float 32

如果需要创建一些特定的矩阵,则可以采用一些指定api:

创建全0数组:

>>> a = np.zeors((3,4))

“””

array([[ 0.,  0.,  0.,  0.],

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

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

“””

创建全1数组,同时也能指定这些数据的dtype:

>>> a = np.ones((3,4), dtype = np.int)

“””

array([[1, 1, 1, 1],

       [1, 1, 1, 1],

       [1, 1, 1, 1]])

“””

创建全空数组,其实每一个值并不是空,只是接近于0:

>>> a = np.empty((3,4))

“””

array([[  0.00000000e+000,   4.94065646e-324,   9.88131292e-324,

          1.48219694e-323],

       [  1.97626258e-323,   2.47032823e-323,   2.96439388e-323,

          3.45845952e-323],

       [  3.95252517e-323,   4.44659081e-323,   4.94065646e-323,

          5.43472210e-323]])

“””

创建连续数组用arrange:

>>> a = np.arrange(10,20,2) #10 到19 的数据,俩步长

#array([10, 12, 14, 16, 18])

使用reshape改变数据形状:

>>> a = np.arrange(12).reshape((3,4))

“””

array([[ 0,  1,  2,  3],

       [ 4,  5,  6,  7],

       [ 8,  9, 10, 11]])

“””

用linspace创建线段型数据:

>>> a = np.linspace(1,10,20) #开始为1,结束为10,分为20个段,生成数据

“””

array([  1.        ,   1.47368421,   1.94736842,   2.42105263,

         2.89473684,   3.36842105,   3.84210526,   4.31578947,

         4.78947368,   5.26315789,   5.73684211,   6.21052632,

         6.68421053,   7.15789474,   7.63157895,   8.10526316,

         8.57894737,   9.05263158,   9.52631579,  10.        ])

“””

并且还能继续进行reshape工作:

>>> a = np.linspace(1,10,20).reshape((5,4))#修改shape

"""

array([[  1.        ,   1.47368421,   1.94736842,   2.42105263],

       [  2.89473684,   3.36842105,   3.84210526,   4.31578947],

       [  4.78947368,   5.26315789,   5.73684211,   6.21052632],

       [  6.68421053,   7.15789474,   7.63157895,   8.10526316],

       [  8.57894737,   9.05263158,   9.52631579,  10.        ]])

"""

Numpy的基本运算

举个例子:

>>> import numpy as np

>>> a = np.array([10,20,30,40])

#array([10,20,30,40])

>>> b = np.arange(4)

#array([0,1,2,3])

>>> c = a – b

#array([10,19,28,37])

>>> c = a + b

#array([10,21,32,43])

>>> c = a * b

#array([0,20,60,120])

而在python中,乘方通常不是用”^”符号表示,而是“**”表示,所以:

>>> c = b**2

#array([0,1,4,9])

不仅如此,在Numpy中有许多数学函数工具,例如sin、cos、tan等:

>>> c = 10 * np.sin(a)

#array([-5.44021111,  9.12945251, -9.88031624,  7.4511316])

并且,除了函数应用外,在脚本中还能直接在print中进行逻辑判断:

>>> print(b < 3)

#array([True, True, True, False],dtype = bool)

若想判断是否等于x,则需要用双等号”==“而不是单等号”=“

如果运算多行多维度矩阵操作:

>>> a = np.array([[1,1],[0,1]])

>>> b = np.arange(4).reshape((2,2))

>>> print(a)

# array([[1, 1],

#       [0, 1]])

>>> print(b)

# array([[0, 1],

#       [2, 3]])

Numpy中矩阵乘法则分为俩种,第一是之前提到的对应元素相乘,第二是标准的矩阵乘法运算,即对应行乘对应列得到相应元素:

>>> c_dot = np.dot(a,b)

# array([[2, 4],

#       [2, 3]])

另一种dot的表示方法:

>>> c_dot_2 = a.dot(b)

# array([[2, 4],

#       [2, 3]])

并且,Numpy中还包含了sum()、min()、max()使用:

>>> import numpy as np

>>> a = np.random.random((2,4))

print(a)

# array([[ 0.94692159,  0.20821798,  0.35339414,  0.2805278 ],

#       [ 0.04836775,  0.04023552,  0.44091941,  0.21665268]])

np.sum(a)   # 4.4043622002745959

np.min(a)   # 0.23651223533671784

np.max(a)   # 0.90438450240606416

并且还能在括号中添加axis值,axis设置为0,列为查找单元,axis值为1,行为查找单元。

print("a =",a)

# a = [[ 0.23651224  0.41900661  0.84869417  0.46456022]

# [ 0.60771087  0.9043845   0.36603285  0.55746074]]

print("sum =",np.sum(a,axis=1))

# sum = [ 1.96877324  2.43558896]

print("min =",np.min(a,axis=0))

# min = [ 0.23651224  0.41900661  0.36603285  0.46456022]

print("max =",np.max(a,axis=1))

# max = [ 0.84869417  0.9043845 ]

Numpy的索引查找

import numpy as np

A = np.arange(2,14).reshape((3,4))

# array([[ 2, 3, 4, 5]

#        [ 6, 7, 8, 9]

#        [10,11,12,13]])

         

print(np.argmin(A))    # 0  

print(np.argmax(A))    # 11

argmin()、argmax()俩个函数分别对应求矩阵中最小元素和最大元素的索引。

如果需要计算均值,则可以用以下俩种方式:

print(np.mean(A)) #7.5

print(np.average(A)) #7.5

print(A.mean()) #7.5

中位数函数:

print(A.median()) #7.5

累加函数:

print(np.cumsum(A))

#[2 5 9 14 20 27 35 44 54 65 77 90]

累差运算函数:

print(np.diff(A))

#[[1,1,1]

#,[1,1,1]

#,[1,1,1]]

nonzero()函数:

<<< print(np.nonzero(A))

#(array([0,0,0,0,1,1,1,1,2,2,2,2]),array([0,1,2,3,0,1,2,3,0,1,2,3]))

第一个数组为不为0的索引第一个坐标,第二个数组同理,组合起来为坐标。

还能排序,用np.sort()

A = np.arange(14,2, -1).reshape((3,4))

# array([[14, 13, 12, 11],

#       [10,  9,  8,  7],

#       [ 6,  5,  4,  3]])

print(np.sort(A))    

# array([[11,12,13,14]

#        [ 7, 8, 9,10]

#        [ 3, 4, 5, 6]])

矩阵转置运算则可以用俩方法:

<<< print(np.transpose(A))

<<< print(A.T)#

array([[14,10, 6]

#        [13, 9, 5]

#        [12, 8, 4]

#        [11, 7, 3]])

# array([[14,10, 6]

#        [13, 9, 5]

#        [12, 8, 4]

#        [11, 7, 3]])

clip()函数格式为clip(Array, Array_min, Array_max)

让矩阵中有比最小值小或者比最大值大的元素,转换为最小值或者最大值。

Numpy的索引

一维索引:

<<< A = np.arange(3,15)

# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

         

print(A[3])    # 6

<<< A = np.arange(3,15).reshape((3,4))

"""

array([[ 3,  4,  5,  6]

       [ 7,  8,  9, 10]

       [11, 12, 13, 14]])

"""

         

<<< print(A[2])         

# [11 12 13 14]

此时A[2]就为A中第三行的所有元素。

二维索引:

<<< print(A[1][1]) #8

<<< print(A[1,1]) #8

<<< print(A[1,1:3]) #[8,9]

<<< for row in A:

<<<  print(row)

“””

[3,4,5,6]

[7,8,9,10]

[11,12,13,14]

“””

<<< for column in A.T:

<<<   print(column)

“””

[3,7,11]

[4,8,12]

[5,9,13]

[6,10,14]

“””

flatten()函数,为展开性质函数,将多维的矩阵进行展开为1行的数列,而flat是一个迭代器,本身是一个object属性:

<<< import numpy as np

<<< A = np.arange(3,15).reshape((3,4))

         

<<< print(A.flatten())   

# array([3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])

<<< for item in A.flat:

<<<     print(item)

    

# 3

# 4

……

# 14

Numpy中,array的合并

np.vstack()

<<< import numpy as np

<<< A = np.array([1,1,1])

<<< B = np.array([2,2,2])

         

<<< print(np.vstack((A,B)))    # vertical stack

"""

[[1,1,1]

 [2,2,2]]

"""

vertical stack 属于一种上下合并,对括号中的俩个整体进行对应操作。探索一下属性可以发现:

<<< C = np.vstack((A,B))

<<< print(A.shape,C.shape)

#(3,)(2,3)

np.hstack()

<<< D = np.hstack((A,B))       # horizontal stack

<<< print(D)

# [1,1,1,2,2,2]

<<< print(A.shape,D.shape)

# (3,) (6,)

通过结果可以看出,D本身来源A,B俩个数列的左右合并。

np.newaxis()增加维度:

<<< print(A[np.newaxis,:])

# [[1 1 1]]

<<< print(A[np.newaxis,:].shape)

# (1,3)

<<< print(A[:,np.newaxis])

"""

[[1]

[1]

[1]]

"""

<<< print(A[:,np.newaxis].shape)

# (3,1)

这样便将有三个元素的array转换成了1*3或者3*1的矩阵了。

np.concatenate()

<<< C = np.concatenate((A,B,B,A),axis=0)

<<< print(C)

"""

array([[1],

       [1],

       [1],

       [2],

       [2],

       [2],

       [2],

       [2],

       [2],

       [1],

       [1],

       [1]])

"""

<<< D = np.concatenate((A,B,B,A),axis=1)

<<< print(D)

"""

array([[1, 2, 2, 1],

       [1, 2, 2, 1],

       [1, 2, 2, 1]])

"""

控制axis的值来选择横向或者纵向打印。

Numpy array分割

<<< A = np.arange(12).reshape((3, 4))

<<< print(A)

"""

array([[ 0,  1,  2,  3],

    [ 4,  5,  6,  7],

    [ 8,  9, 10, 11]])

"""

<<< print(np.split(A,2,axis = 1))

"""

[array([[0, 1],

        [4, 5],

        [8, 9]]), array([[ 2,  3],

        [ 6,  7],

        [10, 11]])]

"""

被纵向分割为俩个array放在一个列表中。

<<< print(np.split(A, 3, axis=0))

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

为横向分割.

因为例子的array只有4列,所以只能等量分割,因此如果输入分割为3份就会报错:

<<< print(np.split(A, 3, axis=1))

# ValueError: array split does not result in an equal division

我们通常采用不等量分割方法来实现:

<<< print(np.array_split(A,3,axis = 1))

"""

[array([[0, 1],

        [4, 5],

        [8, 9]]), array([[ 2],

        [ 6],

        [10]]), array([[ 3],

        [ 7],

        [11]])]

"""

并且,vsplit()与hsplit()也是可以使用。同vstack()与hstack():

<<< print(np.vsplit(A, 3)) #等于 print(np.split(A, 3, axis=0))

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

<<< print(np.hsplit(A, 2)) #等于 print(np.split(A, 2, axis=1))

"""

[array([[0, 1],

       [4, 5],

       [8, 9]]), array([[ 2,  3],

        [ 6,  7],

        [10, 11]])]

"""

Numpy 中的copy与deep copy

简单等号”=“会使得元素之间带有关联性:

<<< import numpy as np

<<< a = np.arange(4)

# array([0, 1, 2, 3])

<<< b = a

<<< c = a

<<< d = b

此时,不论改变a、b、c、d,都会同时改变所有元素,因为所有元素都是指向同一个地址。

<<< b is a  # True

<<< c is a  # True

<<< d is a  # True

而如果想要取消这种类似指针的关联性,需要使用函数.copy():

<<< b = a.copy()    # deep copy

<<< print(b)        # array([11, 22, 33,  3])

<<< a[3] = 44

<<< print(a)        # array([11, 22, 33, 44])

<<< print(b)        # array([11, 22, 33,  3])

此时,则没有了关联性。