NumPy库的基本使用

一、介绍

  ——NumPy库是高性能科学计算和数据分析的基础包,它是Pandas及其它各种工具的基础

  ——NumPy里的ndarry多维数组对象,与列表的区别是:

    - 数组对象内的元素类型必须一样

    - 数组大小不可修改

  ——数组对象的常用属性:

    - T    数组的转置(在多维数组里,将列转成行,行转成列的操作)

    - dtype   数据元素的数据类型

    - size     数组元素的个数

    - ndim    数组的维数

    - shape  数组的维度大小

二、创建ndarray对象

  1、基本创建数组的方法:

import numpy as np #首先需要导入numpy库

#创建一维的narray对象
a1 = np.array([1,2,3,4,5])    #一个列表

#创建二维的narray对象
a2 = np.array([[1,2,3,4,5],[6,7,8,9,10]])    # 一个列表里套两个列表

#创建多维对象以次类推

    指定数据类型: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)
# int32
a = np.array([2,23,4],dtype=np.float)
print(a.dtype)
# float64
a = np.array([2,23,4],dtype=np.float32)
print(a.dtype)
# float32

  自带的几种数组创建方法:

  1、zeros:创建全零数组

    a = np.zeros((3,4)) # 数据全为0,3行4列

  2、ones:创建全一数组, 同时也能指定这些特定数据的 dtype:

    a = np.ones((5,3),dtype = np.int) # 数据为1,5行3列

  3、empty:创建全空数组, 其实每个值都是接近于零的数:

    a = np.empty((2,2)) # 数据为empty,2行2列

  4、arange:传值创建连续数组:

a = np.arange(10) # 默认从0开始到10(不包括10),步长为1
print(a) # 返回 [0 1 2 3 4 5 6 7 8 9]

a = np.arange(5,20,2) # 从5开始到20(不包括20),步长为2
print(a) # 返回 [ 5  7  9 11 13 15 17 19]

   5、reshape()函数通常结合arange()函数使用,改变数组的维度

# 将一维数组a变为3*4的数组
a=np.arange(12).reshape((3,4))

# 将a变回为一维数组
a.reshape((12,))

  6、linspace()函数跟arange()函数相似,前两个参数指定序列的开头和结尾,第三个参数指定将数组拆分成几个

np.linspace(0,10,5)
# array([  0. ,   2.5,   5. ,   7.5,  10. ])

  7、random()函数使用随机数填充数组

# 生成一维数组
a = np.random.random(3) 
print(a)
# array([ 0.0092522 ,  0.44961339,  0.85684498])

# 生成多维数组
a = np.random.random((3,3))
print(a)
# array([[ 0.50311642,  0.25961784,  0.30587642],
       [ 0.55388356,  0.92739877,  0.26140058],
       [ 0.63482092,  0.45938232,  0.84053653]])
# 生成的都是0~1范围的小数

三、数组基本操作

  1、算术运算符

    算术运算符可以用于数组和标量之间

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

>>> a+4
array([4, 5, 6, 7])

>>> a-4
array([-4, -3, -2, -1])

>>> a*4
array([ 0,  4,  8, 12])

>>> a/2
array([0, 0, 1, 1])

    还可以用于两个数组之间,这两个数组的元素位置必须相同,也就是具有相同的型

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

>>> b=np.arange(4,8)
>>> b
array([4, 5, 6, 7])

>>> a+b
array([ 4,  6,  8, 10])

>>> a-b
array([-4, -4, -4, -4])

>>> a*b
array([ 0,  5, 12, 21])

>>> a/b
array([0, 0, 0, 0]) #整数相除只取商
>>> a**2
array([ 0, 1, 4, 9])
>>> a%b    # 相除后取余数
array([ 0,  5, 12, 21]) 

  对于多维数组是一样适用的,

>>> A=np.arange(9).reshape((3,3))
>>> A
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])

>>> B=np.ones((3,3))
>>> B
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])

>>> A*B
array([[ 0.,  1.,  2.],
       [ 3.,  4.,  5.],
       [ 6.,  7.,  8.]])

  2、数组的索引与切片

A = np.arange(3,15).reshape((3,4))
"""
array([[ 3,  4,  5,  6]
       [ 7,  8,  9, 10]
       [11, 12, 13, 14]])
在这样的二维数组中,每一行有从0开始的索引,每一行里的元素也有自己的索引,所以:
"""
print(A[2])         
# [11 12 13 14]

print(A[2,2])
# 13

    切片

# 数组也有类似列表的切片操作
A = np.arange(3,15).reshape((3,4))
"""
array([[ 3,  4,  5,  6]
       [ 7,  8,  9, 10]
       [11, 12, 13, 14]])
"""

print(A[1,0:2])
# [7,8]

print(A[0:2,1:3])
"""
array([[4,  5]
       [8,  9]
       [12, 13]])
"""

  Numpy 的 copy & deepcopy:

    = 的赋值方式会带有关联性:

import numpy as np

a = np.arange(4)
# array([0, 1, 2, 3])

b = a
c = a
d = b

    改变a的第一个值,bcd的第一个值也会同时改变。

a[0] = 11
print(a)
# array([11,  1,  2,  3])

    确认bcd是否与a相同。

print(b is a)  # True
print(c is a)  # True
print(d is a)  # True

    同样的,更改d的值,abc也会改变。

d[1:3] = [22, 33]   # array([11, 22, 33,  3])
print(a)            # array([11, 22, 33,  3])
print(b)            # array([11, 22, 33,  3])
print(c)            # array([11, 22, 33,  3])

    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])

  3、矩阵常用函数    

    1)最大值最小值

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
print(a.max()) #获取整个矩阵的最大值 结果: 6
print(a.min()) #最小值,结果:1

# 可以指定关键字参数axis来获得行最大(小)值或列最大(小)值
# axis=0 行方向最大(小)值,即获得每列的最大(小)值
# axis=1 列方向最大(小)值,即获得每行的最大(小)值
# 例如

print(a.max(axis=0))
# 结果为 [4 5 6]

print(a.max(axis=1))
# 结果为 [3 6]

# 要想获得最大最小值元素所在的位置,可以通过argmax函数来获得
print(a.argmax(axis=1))
# 结果为 [2 2]

    2)平均值

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
print(a.mean()) #结果为: 3.5

# 同样地,可以通过关键字axis参数指定沿哪个方向获取平均值
print(a.mean(axis=0)) # 结果 [ 2.5  3.5  4.5]
print(a.mean(axis=1)) # 结果 [ 2.  5.]

    3)方差:方差的函数为var(),方差函数var()相当于函数mean(abs(x - x.mean())**2),其中x为矩阵。

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
print(a.var()) # 结果 2.91666666667

print(a.var(axis=0)) # 结果 [ 2.25  2.25  2.25]
print(a.var(axis=1)) # 结果 [ 0.66666667  0.66666667]

    4)标准差:标准差的函数为std(),std()相当于sqrt(mean(abs(x - x.mean())**2)),或相当于sqrt(x.var())

import numpy as np

a = np.array([[1,2,3],[4,5,6]])
print(a.std()) # 结果 1.70782512766

print(a.std(axis=0)) # 结果 [ 1.5  1.5  1.5]
print(a.std(axis=1)) # 结果 [ 0.81649658  0.81649658]

    5)中值:中值指的是将序列按大小顺序排列后,排在中间的那个值,如果有偶数个数,则是排在中间两个数的平均值。

import numpy as np
x = np.array([[1,2,3],[4,5,6]])

print(np.median(x))  # 对所有数取中值
# 结果 3.5

print(np.median(x,axis=0))  # 沿第一维方向取中值
# 结果 [ 2.5  3.5  4.5]

print(np.median(x,axis=1))  # 沿第二维方向取中值
# 结果 [ 2.  5.]

    6)求和:矩阵求和的函数是sum(),可以对行,列,或整个矩阵求和

import numpy as np

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

print(a.sum())           # 对整个矩阵求和
# 结果 21

print(a.sum(axis=0)) # 对行方向求和
# 结果 [5 7 9]

print(a.sum(axis=1)) # 对列方向求和
# 结果 [ 6 15]

    7)累积和:

import numpy as np

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

print(a.cumsum())            # 对整个矩阵求累积和
# 结果 [ 1  3  6 10 15 21]

print(a.cumsum(axis=0))  # 对行方向求累积和
"""
结果[[1 2 4]
 [5 7 9]]
"""

print(a.cumsum(axis=1))  # 对列方向求累积和
"""
结果
[[ 1  3  6]
 [ 4  9 15]]
"""

 

原文地址:https://www.cnblogs.com/value-code/p/8377585.html