Python-Numpy模块入门

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])
此时,则没有了关联性。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值