NumPy
全称Numerical Python,是Python数值计算中最重要的基础包,大多数计算包都提供了基于NumPy的科学函数功能,将NumPy的数组对象作为数据交换的通用语。
以下内容大多来自《利用python进行数据分析》一书,非常值得拥有的一本书,带你走进数据分析的世界。
Numpy基本操作
import numpy as np
# Numpy ndarray: 多维数组对象
# 1.创建ndarray
# 1.1 生成随机数组
# range_arr = np.random.randn(2, 3)
# 1.2 arange()函数,模仿python的range函数,默认类型int64
# range_arr2 = np.arange(20, dtype=np.float64)
# print(range_arr2, range_arr2.dtype)
# 1.2 用list创建ndarray
test_arr1 = np.array([1, 2, 3, 4])
test_arr2 = np.array([5, 6, 7, 8])
test_arr3 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
test_arr4 = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])
# 1.3 如果想创建同构array,可以传入dtype参数,用来指定每个元素的数据类型
# test_arr5 = np.array([1, 2, 3], dtype=np.int8)
# print(test_arr5, test_arr5.dtype)
# 1.4 用dict生成array
# test_arr5 = np.array(list({'a':1, 'b':2}.values()))
# print(test_arr5, type(test_arr5), test_arr5.size, test_arr5.dtype, test_arr5.ndim)
# 1.5 创建长度为n的全0的array
# n = 20
# zero_array = np.zeros(n)
# print(zero_array)
# 1.6 one函数,创建给定形状和数据类型的值全为1的数组
# one_array = np.ones(15, dtype=np.float64)
# print(one_array)
# 1.7 根据给定数组的形状,生成一个形状一个的全1数组
# parent_arr = np.array([1,2,3,4,5])
# ones_like_array = np.ones_like(parent_arr)
# print(ones_like_array)
# 1.8 和ones_like类似,还有一个ones_zero(),区别在于生成的是全0数组
# 1.9 根据给定形状,生成一个没有初始化数值的空数组
# Note:生成的数值是垃圾数值,原因在于生成的是一个未初始化的array
# size = (4, 2)
# empty_array = np.empty(size)
# print(empty_array)
# 1.10 empty_like()函数,类似ones_like
# 1.11 根据给定的形状和数据类型生成指定数值的数组
# Note:fill_value参数接受一个整数,所以生成所有元素都是这个整数值
# full_array = np.full(shape=(4,), fill_value=6)
# print(full_array)
# 1.12 根据所给定的数组生成一个形状一样,但内容是指定数值的数组
# parent_array = np.array([1,2,3,4,5])
# full_like_array = np.full_like(parent_array, fill_value=7, dtype=np.int64)
# print(full_like_array) # output: [7, 7, 7, 7, 7]
# 1.13 生成一个 N * N 特征矩阵,对角线上值为1,其余位置为0
# feature_array = np.eye(N=10)
# print(feature_array)
#
# feature_array2 = np.identity(n=10)
# print(feature_array2)
# 2.ndarray 加法
# 2.1 和常数相加,array中每个元素都会和这个常数相加,结果仍是ndarray
# res = test_arr + 1
# print(res)
#
# res2 = test_arr2 + 1
# print(res2)
# 2.2 和常数相乘,array中每个元素都会和这个常数相乘,结果仍是ndarray
# res = test_arr * 2
# print(res)
#
# res2 = test_arr2 * 2
# print(res2)
# 2.3 和array相加,对应位置相加
# res = test_arr1 + test_arr2
# print(res)
#
# res2 = test_arr3 + test_arr4
# print(res2)
# 2.4 和array相乘,对应位置相乘
# res = test_arr1 * test_arr2
# print(res)
#
# res2 = test_arr3 * test_arr4
# print(res2)
# 3.查看ndarray的形状,shape属性返回的是一个tuple类型
# shape = test_arr1.shape
# 3.1 判断array的形状是不是符合预期,比如预期是一维数组,包含4个元素
# if shape == (4,):
# print("Shape meet expectations.")
# 3.2 判断array是不是一维ndarray
# if test_arr1.ndim == 1:
# print(test_arr1.ndim)
#
# if test_arr3.ndim == 2:
# print("this is a two-dimensional array.")
# 4.判断一个变量是否是ndarray类型
# if type(test_arr1) is np.ndarray:
# print("test_arr1 is ndarray.")
#
# if isinstance(test_arr1, np.ndarray):
# print("test_arr1 is ndarray.")
# 5.查看array中元素的数据类型
# array.dtype存储了array的数据类型,改属性返回的str类型,可以用字符串判断
# data_type = test_arr1.dtype
# print(data_type, type(data_type))
# 5.1 判断array中的元素是否是 numpy.int64 类型
# print(type(test_arr1.dtype), type(np.int64))
# if test_arr1.dtype == "int64":
# print("yes, all element is np.dtype.int64")
# 6.转换数据类型
# 6.1 将array中所有数值转为np.float64
# Note: 需要注意,astype方法会生成一个新的array作为返回值,并不会修改原array。
# transfered_arr = test_arr1.astype(np.float64)
# print(test_arr1.dtype, transfered_arr.dtype, transfered_arr)
# 6.2 np.int64 转 np.bool,可用来检查array中的值是否为0,并用True or False进行标记
# Note:注意np.nan这个值,在转bool时,认为 np.nan 是True
# test_arr5 = np.array([1, 0, np.nan, 2, 3, 4])
# str_array = test_arr5.astype(np.bool)
# print(str_array)
# 6.3 np.int64 转为 字符串
# str_array = test_arr1.tostring()
# print(str_array)
# 6.4 日期字符串 转 日期型
# 6.4.1 astype传入参数"M8",表示格式化时间为 '%YYYY-%mm-%ddT%HH%MM%SS',如果给定格式不对,会进行格式补全
# dt_array = np.array(['2018', '2019-01-01', '2019-08-20 00:00:00', '217', '12', '678324'])
# dt = dt_array.astype("M8")
# print(dt, dt.dtype)
# 6.4.2 获取日期字符串中的年份
# dt_array = np.array(['2018', '2019-01-01', '2019-08-20 00:00:00'])
# dt_year = dt_array.astype("M8[Y]")
# print(dt_year)
# 6.4.3 以此类推,当然可以获取月,日,时,分,秒
# Note:需要注意,是从年开始截取的,比如到'日',output: ['2018-01-01' '2019-01-01' '2019-08-20']
# dt_month = dt_array.astype("M8[M]")
# print(dt_month)
#
# dt_day = dt_array.astype("M8[D]")
# print(dt_day)
#
# dt_hour = dt_array.astype("M8[h]")
# print(dt_hour)
#
# dt_minute = dt_array.astype("M8[m]")
# print(dt_minute)
#
# dt_second = dt_array.astype("M8[s]")
# print(dt_second)
# 6.4.4 将时间字符串 转 int64,转完了是时间戳
# dt_year_int = dt_array.astype("M8[Y]").astype("int64") # 从1970年到数据时间中的年份相差的年数
# dt_month_int = dt_array.astype("M8[M]").astype("int64") # 从1970年到数据时间中的月份相差的月数
# dt_day_int = dt_array.astype("M8[D]").astype("int64") # 以此类推
# dt_hour_int = dt_array.astype("M8[h]").astype("int64")
# dt_minute_int = dt_array.astype("M8[m]").astype("int64")
# dt_second_int = dt_array.astype("M8[s]").astype("int64")
#
# print(dt_year_int)
# print(dt_month_int)
# print(dt_day_int)
# print(dt_hour_int)
# print(dt_minute_int)
# print(dt_second_int)
# 7.从array中取值
# 7.1 使用索引
# temp = test_arr1[2]
# print(temp)
# 7.2 使用切片,切片是左闭右开的区间,到倒数第二个数,但是不包含倒数第二个数
# temp = test_arr1[:-2]
# print(temp)
# 测试:修改切片的值会改动原来的array么?和python的list类似,是可以修改的。
# 而且,使用array 和 list 都可以进行替换。
# test_arr1[:-2] = np.array([7, 8])
# print(test_arr1)
# test_arr1[:-2] = [7, 8]
# print(test_arr1)
# 7.3 如果是二维数组,可以用下面两种方式获取单个元素
# 比如,获取第二行,第三列的元素
# temp1 = test_arr3[1][2]
# temp2 = test_arr3[1, 2]
# print(temp1)
# print(temp2)
# 8.复制array
# test_array5 = test_arr1.copy()
# print(test_array5)
# if test_array5 is not test_arr1:
# print("there not the same array")
# 9.二维数组的切片
# 以一个(3, 3)的二维数组为例
# test_arr5 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 9.1 如果想获取第一列?
# column1 = test_arr5[:, :1]
# print(column1)
# 9.2 如果想获取前两列呢?
# column2 = test_arr5[:, :2]
# print(column2)
# 9.3 来个再难一点的,如果想获取前两行前两列呢?
# square = test_arr5[:2, :2]
# print(square)
# 9.4 如果想获取第二行的前两列呢?
# wrried = test_arr5[1:2, :2]
# print(wrried)