一、NumPy

ndarray 理解多维数组

  1. import numpy as np
  2. # 生成指定维度的随机多维数据
  3. #数学建模应该用不到
  4. data = np.random.rand(2, 3)
  5. print (data)
  6. print (type(data))
  7. #type是显示数据类型;shape显示维度;ndim维度个数;type另外的作用
  1. [[0.46686682 0.68844304 0.76663872]
  2. [0.70747721 0.47887587 0.25943412]]
  3. <class 'numpy.ndarray'>

ndim, shape 和 dtype 属性

  1. print ('维度个数', data.ndim)
  2. print ('各维度大小: ', data.shape)
  3. print ('数据类型: ', data.dtype)
  1. 维度个数 2
  2. 各维度大小: (2, 3)
  3. 数据类型: float64

创建ndarray

  1. '''1. array创建'''
  2. # list转换为 ndarray
  3. l = range(10)
  4. data = np.array(l)
  5. print (data)
  6. print (data.shape)
  7. print (data.ndim)
  1. [0 1 2 3 4 5 6 7 8 9]
  2. (10,)
  3. 1
  1. # 嵌套序列转换为ndarray
  2. l2 = [range(10), range(10)]
  3. #就这样形成了一个数组
  4. data = np.array(l2)
  5. print (data)
  6. print (data.shape)
  1. [[0 1 2 3 4 5 6 7 8 9]
  2. [0 1 2 3 4 5 6 7 8 9]]
  3. (2, 10)
  1. '''2. zeros;ones;empty创建'''
  2. # np.zeros
  3. zeros_arr = np.zeros((3, 4))
  4. #注意元组,这里经常报错
  5. # np.ones
  6. ones_arr = np.ones((2, 3))
  7. # np.empty[不全为零,而且是随机的一些数字]
  8. empty_arr = np.empty((3, 3))
  9. # np.empty 指定数据类型
  10. empty_int_arr = np.empty((3, 3), int)
  11. print (zeros_arr)
  12. print ('-------------')
  13. print (ones_arr)
  14. print ('-------------')
  15. print (empty_arr)
  16. print ('-------------')
  17. print (empty_int_arr)
  1. [[0. 0. 0. 0.]
  2. [0. 0. 0. 0.]
  3. [0. 0. 0. 0.]]
  4. -------------
  5. [[1. 1. 1.]
  6. [1. 1. 1.]]
  7. -------------
  8. [[0.000e+000 0.000e+000 0.000e+000]
  9. [0.000e+000 0.000e+000 2.174e-321]
  10. [0.000e+000 0.000e+000 0.000e+000]]
  11. -------------
  12. [[0 0 0]
  13. [0 0 0]
  14. [0 0 0]]
  1. # np.arange()
  2. #创建一系列连续的数算是numpy里面类似python里面range的功能
  3. print (np.arange(10))
  1. [0 1 2 3 4 5 6 7 8 9]

二、操作nddarray

矢量化 (vectorization)

  1. # 矢量与矢量运算
  2. arr = np.array([[1, 2, 3],
  3. [4, 5, 6]])
  4. print ("元素之间相乘:")
  5. #注意区分矩阵之间的运算。这里的矢量原酸相当于是广播式的运算
  6. print (arr * arr)
  7. print ("矩阵相加:")
  8. print (arr + arr)
  1. 元素之间相乘:
  2. [[ 1 4 9]
  3. [16 25 36]]
  4. 矩阵相加:
  5. [[ 2 4 6]
  6. [ 8 10 12]]
  1. # 矢量与标量运算
  2. print (1. / arr)
  3. print (2. * arr)
  1. [[1. 0.5 0.33333333]
  2. [0.25 0.2 0.16666667]]
  3. [[ 2. 4. 6.]
  4. [ 8. 10. 12.]]

索引与切片

  1. # 一维数组
  2. arr1 = np.arange(10)
  3. print (arr1)
  4. print (arr1[2:5])
  1. [0 1 2 3 4 5 6 7 8 9]
  2. [2 3 4]
  1. # 多维数组
  2. arr2 = np.arange(12).reshape(3,4)
  3. #要学会定义多维数组,arange是形成12个随机数,之后的reshape是形成维数
  4. #多维数组的空间含义就是比如:3.4.5=长4宽5高3
  5. #还有点数就是应用函数
  6. print (arr2)
  1. [[ 0 1 2 3]
  2. [ 4 5 6 7]
  3. [ 8 9 10 11]]
  1. print (arr2[1])
  2. print (arr2[0:2, 2:])
  3. print (arr2[:, 1:3])
  1. [4 5 6 7]
  2. [[2 3]
  3. [6 7]]
  4. [[ 1 2]
  5. [ 5 6]
  6. [ 9 10]]
  1. # 条件索引
  2. # 找出 data_arr 中 2015年后的数据
  3. data_arr = np.random.rand(3,3)
  4. print (data_arr)
  5. year_arr = np.array([[2000, 2001, 2000],
  6. [2005, 2002, 2009],
  7. [2001, 2003, 2010]])
  8. is_year_after_2005 = year_arr >= 2005
  9. #:他会扩展成同类型的数组
  10. print (is_year_after_2005, is_year_after_2005.dtype)
  11. filtered_arr = data_arr[is_year_after_2005]
  12. filtered_arr = data_arr[year_arr >= 2005]
  13. print (filtered_arr)
  14. #中间的一些语句可以删除
  15. #最后生成得是一维数组,进行数据过滤的时候很有用
  1. [[0.61482194 0.0249229 0.28525661]
  2. [0.05121173 0.37672803 0.86259463]
  3. [0.22648329 0.4581513 0.18620441]]
  4. [[False False False]
  5. [ True False True]
  6. [False False True]] bool
  7. [0.05121173 0.86259463 0.18620441]
  1. # 多个条件& |
  2. filtered_arr = data_arr[(year_arr <= 2005) & (year_arr % 2 == 0)]
  3. print (filtered_arr)
  1. [0.61482194 0.28525661 0.37672803]

转置 === transpose

  1. arr = np.random.rand(2,3)
  2. print (arr)
  3. print (arr.transpose())
  1. [[0.01538974 0.47573964 0.90684253]
  2. [0.93683601 0.64306611 0.63846634]]
  3. [[0.01538974 0.93683601]
  4. [0.47573964 0.64306611]
  5. [0.90684253 0.63846634]]
  1. #高维数组的转换(图像里面会用得到转换维度)
  2. arr3d = np.random.rand(2,3,4)
  3. print (arr3d)
  4. print ('----------------------')
  5. print (arr3d.transpose((1,0,2))) # 多维数组的转置和定义不会
  1. [[[0.18074837 0.64652003 0.80527972 0.67800268]
  2. [0.95766577 0.2498768 0.00304503 0.7058178 ]
  3. [0.12523549 0.18796252 0.72463798 0.15352211]]
  4. [[0.38808013 0.31075033 0.53082474 0.32254431]
  5. [0.6861262 0.02999367 0.70980993 0.09099878]
  6. [0.14987301 0.78237398 0.90159408 0.82897071]]]
  7. ----------------------
  8. [[[0.18074837 0.64652003 0.80527972 0.67800268]
  9. [0.38808013 0.31075033 0.53082474 0.32254431]]
  10. [[0.95766577 0.2498768 0.00304503 0.7058178 ]
  11. [0.6861262 0.02999367 0.70980993 0.09099878]]
  12. [[0.12523549 0.18796252 0.72463798 0.15352211]
  13. [0.14987301 0.78237398 0.90159408 0.82897071]]]

ndarray数据类型转化 === astype

  1. zeros_float_arr = np.zeros((3, 4), dtype=np.float64)
  2. print (zeros_float_arr)
  3. print (zeros_float_arr.dtype)
  4. # astype转换数据类型
  5. zeros_int_arr = zeros_float_arr.astype(np.int32)
  6. print (zeros_int_arr)
  7. print (zeros_int_arr.dtype)
  1. [[0. 0. 0. 0.]
  2. [0. 0. 0. 0.]
  3. [0. 0. 0. 0.]]
  4. float64
  5. [[0 0 0 0]
  6. [0 0 0 0]
  7. [0 0 0 0]]
  8. int32

文本文件的读取

  1. # loadtxt
  2. filename = './presidential_polls.csv'
  3. data_array = np.loadtxt(filename, # 文件名
  4. delimiter=',', # 指定里面的元素分隔符
  5. dtype=str, # 指定数据类型
  6. usecols=(0,2,3)) # 指定读取的列索引号
  7. print (data_array, data_array.shape)
  1. [['cycle' 'type' 'matchup']
  2. ['2016' '"polls-plus"' '"Clinton vs. Trump vs. Johnson"']
  3. ['2016' '"polls-plus"' '"Clinton vs. Trump vs. Johnson"']
  4. ...
  5. ['2016' '"polls-only"' '"Clinton vs. Trump vs. Johnson"']
  6. ['2016' '"polls-only"' '"Clinton vs. Trump vs. Johnson"']
  7. ['2016' '"polls-only"' '"Clinton vs. Trump vs. Johnson"']] (10237, 3)
  1. # loadtxt, 明确指定每列数据的类型
  2. filename = './presidential_polls.csv'
  3. data_array = np.loadtxt(filename, # 文件名
  4. delimiter=',', # 分隔符
  5. skiprows=1,
  6. dtype={'names':('cycle', 'type', 'matchup'),
  7. 'formats':('i4', 'S15', 'S50')}, # 数据类型
  8. usecols=(0,2,3)) # 指定读取的列索引号
  9. print (data_array, data_array.shape) # 读取的结果是一维的数组,每个元素是一个元组
  1. [(2016, b'"polls-plus"', b'"Clinton vs. Trump vs. Johnson"')
  2. (2016, b'"polls-plus"', b'"Clinton vs. Trump vs. Johnson"')
  3. (2016, b'"polls-plus"', b'"Clinton vs. Trump vs. Johnson"') ...
  4. (2016, b'"polls-only"', b'"Clinton vs. Trump vs. Johnson"')
  5. (2016, b'"polls-only"', b'"Clinton vs. Trump vs. Johnson"')
  6. (2016, b'"polls-only"', b'"Clinton vs. Trump vs. Johnson"')] (10236,)

三、np的常用函数

转置transpose

  1. import numpy as np
  1. arr = np.random.rand(2,3)
  2. print (arr)
  3. print (arr.transpose())
  1. [[0.78485041 0.88817969 0.34809014]
  2. [0.32744286 0.97539301 0.94401872]]
  3. [[0.78485041 0.32744286]
  4. [0.88817969 0.97539301]
  5. [0.34809014 0.94401872]]
  1. #高维数组的转换(图像里面会用得到转换维度)
  2. #不懂这里!!!
  3. arr3d = np.random.rand(2,3,4)
  4. print (arr3d)
  5. print ('----------------------')
  6. print (arr3d.transpose((1,0,2))) # 多维数组的转置和定义不会
  1. [[[0.28492549 0.60197236 0.45582367 0.21992479]
  2. [0.1747163 0.69201365 0.85460359 0.65311699]
  3. [0.62189644 0.25217555 0.16347156 0.29831219]]
  4. [[0.42826733 0.81396165 0.187138 0.560564 ]
  5. [0.10162186 0.66419751 0.03261665 0.06969256]
  6. [0.55461652 0.55020586 0.50693591 0.31741807]]]
  7. ----------------------
  8. [[[0.28492549 0.60197236 0.45582367 0.21992479]
  9. [0.42826733 0.81396165 0.187138 0.560564 ]]
  10. [[0.1747163 0.69201365 0.85460359 0.65311699]
  11. [0.10162186 0.66419751 0.03261665 0.06969256]]
  12. [[0.62189644 0.25217555 0.16347156 0.29831219]
  13. [0.55461652 0.55020586 0.50693591 0.31741807]]]

ceil和floor和rint和isnan

  1. arr = np.random.randn(2,3)
  2. print (arr)
  3. print (np.ceil(arr))
  4. #向上最接近的整数
  5. print (np.floor(arr))
  6. #向下最接近的整数
  7. print (np.rint(arr))
  8. #四舍五入
  9. print (np.isnan(arr))
  10. #判断元素是否为NaN
  11. #笔记上还有其他的函数
  1. [[ 0.262106 -1.33680008 -1.08562543]
  2. [ 0.3990978 0.1410074 0.64278274]]
  3. [[ 1. -1. -1.]
  4. [ 1. 1. 1.]]
  5. [[ 0. -2. -2.]
  6. [ 0. 0. 0.]]
  7. [[ 0. -1. -1.]
  8. [ 0. 0. 1.]]
  9. [[False False False]
  10. [False False False]]

where

  1. arr = np.random.randn(3,4)
  2. print (arr)
  3. np.where(arr > 0, 1, -1)
  4. #(条件,满足输出,不满足输出)
  1. [[ 2.04688394 0.48063737 1.20876913 -0.93412937]
  2. [-0.43427472 -1.47755481 0.36882256 -0.08943138]
  3. [-0.2847686 0.96915893 0.32641235 0.28346922]]
  4. array([[ 1, 1, 1, -1],
  5. [-1, -1, 1, -1],
  6. [-1, 1, 1, 1]])

sum

  1. arr = np.arange(10).reshape(5,2)
  2. print (arr)
  3. print (np.sum(arr))
  4. print (np.sum(arr, axis=0))
  5. print (np.sum(arr, axis=1))
  1. [[0 1]
  2. [2 3]
  3. [4 5]
  4. [6 7]
  5. [8 9]]
  6. 45
  7. [20 25]
  8. [ 1 5 9 13 17]

all和any

  1. import numpy as np
  2. arr = np.random.randn(2,3)
  3. print (arr)
  4. print (np.any(arr > 0))
  5. #有一个就对
  6. print (np.all(arr > 0))
  7. #全部对才对
  8. '''
  9. ·用处就是判断一组数据当中,是否===有点类似布尔类型的
  10. ·这个也可以应用在pandas中的DataFrame中
  11. '''
  1. [[-1.020184 -0.48466272 -0.8496271 ]
  2. [ 0.88815825 -0.81911857 0.64570539]]
  3. True
  4. False
  5. '\n·用处就是判断一组数据当中,是否===有点类似布尔类型的\n·这个也可以应用在pandas中的DataFrame中\n'

unique

  1. arr = np.array([[1, 2, 1], [2, 3, 4]])
  2. print (arr)
  3. print (np.unique(arr))
  1. [[1 2 1]
  2. [2 3 4]]
  3. [1 2 3 4]