轴(axis)
可以理解为方向,使用0,1,2…数字表示,对于一个一维数组,只有一个0轴,二维数组有0轴和1轴,三维数组有0,1,2轴,以此类推。(可以理解为数学中的x,y,z轴)
有了轴的概念,计算更加方便,比如计算一个二维数组的平均值,必须指定是哪个方向上面的数字的平均值。
CSV文件
显示:表格状态
源文件:换行和逗号分隔行列的格式化文本,每一行数据表示一条记录。
由于csv便于展示,读取和写入,所以很多地方也是用csv的格式存储和传输中
小型的数据,为了方便教学,我们会经常操作csv格式的文件,但是操作数据库中的数据也是很容易的实现的
Numpy读取数据
numpy.loadtxt()
可以包括一下参数:
- frame:文件、字符串或产生器,可以是gz或者bz2压缩文件
- dtype:数据类型。csv的字符串以什么数据类型读入数组中,默认float
- delimiter:分隔字符串的符号,默认是空格
- skiprows:跳过前x行,一般跳过第一行表头
- usecols:读取指定列、索引,元组类型
- unpack:如果为True,读入属性将分别写入不同数组变量。如果为False,读入数据只写入一个数组变量。默认为False。
import numpy as np
testCsvFilePath = '../titanic/CSV1.csv'
testData = np.loadtxt(testCsvFilePath,delimiter=",",dtype="int")
testData2 = np.loadtxt(testCsvFilePath,delimiter=",",dtype="int",unpack=True)
'''
不指定dtype类型默认使用科学计数法
delimiter="," 以逗号分隔,与csv文件中的分隔形式对应
skiprows=1 跳过第一行,一般跳过表头
unpack=True 数据按照属性存入不同数组变量,也可以理解为转置(行变为列,列变为行)
'''
print(testData)
print(testData2)
'''print result
[[ 1 24 50000]
[ 2 45 56000]
[ 3 29 400000]]
[[ 1 2 3]
[ 24 45 29]
[ 50000 56000 400000]]
'''
数据处理
Numpy中的转置
转置是一种变换,在对角线方向交换数据(行变为列,列变为行),有以下几种方法:
(1)Array.transpose()
(2)Array.swapaxes(1,0) (交换轴)
(3)Array.T
t1 = np.loadtxt(testCsvFilePath,delimiter=",",dtype="int")
print(t1.transpose())
print(t1.T)
print(t1.swapaxes(1,0))
'''print result
[[ 1 2 3]
[ 24 45 29]
[ 50000 56000 400000]]
[[ 1 2 3]
[ 24 45 29]
[ 50000 56000 400000]]
[[ 1 2 3]
[ 24 45 29]
[ 50000 56000 400000]]
'''
取行数据
(1)取一行数据
print(t1[num])
# t1是二维数组,取一个索引值即可
(2)取连续的多行数据
print(t1[num1:num2])
# 使用切片,取索引值为num1到(num2-1)之间的行
(3)取不连续的多行数据
print(t1[ [2,4,6] ])
# t1[ indexList ] 取索引值为indexList列表中的行
取列数据
(1)取一列数据
print(t1[:,num])
# 使用冒号,num表示取列的索引值
(2)取连续的多列数据
print(t1[:,num1:num2])
# 取索引值为num1到(num2-1)之间的列
(3)取不连续的多列数据
print(t1[ :,[2,4,6] ])
# 取索引值为2,4,6的列
取固定区域数据
根据坐标取值
data_1 = t1[2,4] # t1[num1,num2] 取行为num1,列为num2的数据print(t1[[0,1,2],[2,0,1]]) # 取坐标为(0,2)(1,0)(2,1)三个点
区域取值
print(t1[0:2,0:2]) # 第0行到第1行,第0列到第1列的交叉处的数据
import numpy as np
条件判断修改
# print(a1<40)
# 对数组使用条件判断,即对数组中的所有数据进行条件判断,若符合条件则赋值为True,不符合赋值为False
print(a1[a1<40])
a1[ a1<40 ] = 20 # 讲a1数组中符合a1<40的数据赋值为20
print(a1)
where三元运算符
# np.where(判断语句,data1,data2)
# 若数局符合判断条件,赋值为data1,否则赋值为data2
print(np.where(a2<30,0,30))
裁剪
# array.clip(data1,data2) 将array中小于data1的数据赋值为data1,大于data2的数值赋值为data2
print(b1.clip(10,200))
获取最大值最小值的位置
# 获取最大值最小值的位置
res1 = np.argmax(c1,axis=0)
# 返回一个列表,里面是每一列的最大值位置
res2 = np.argmin(c1,axis=1)
# 返回一个列表,里面是每一行的最小值位置
print(res1)
print(res2)
创建全为0的数组
# np.zeros( (a,b) ) a行b列的数组
zeroArray = np.zeros( (3,4) )
zeroArray = zeroArray.astype(int)
print(zeroArray)
创建全为1的数组
# np.ones( (a,b) ) a行b列的数组
oneArray = np.ones( (3,4) ).astype(int)
print(oneArray)
创建对角线为1的方阵
# 创建一个对角线为1的正方形数组
# np.eye(num) 边长为num,对角线为1,其他全为0的方阵
print(np.eye(5).astype(int))
水平拼接
# np.hstack( (array1,array2) )
print(np.hstack((a1,a2)))
竖直拼接
# np.vstack( (array1,array2) )
print(np.vstack((a1,a2)))
行交换
b1[[1,2],:] = b1[[2,1],:]
# 交换索引值为1和2的行数据
print(b1)
列交换
b2[:,[0,1]] = b2[:,[1,0]]
# 交换索引值为0和1的列数据
print(b2)
numpy中的nan和inf
- nan(not a number):表示不是一个数字。当我们读取本地文件的数据为float类型时,如果有缺失,就会出现nan,活着做了一个不合适的计算的时候(如无穷大减去无穷大)
- inf(infinity):表示正无穷,-inf表示负无穷。当一个数字除以0时,python中会报错,出现inf活着-inf
(一)将一个数据赋值为nan或者inf
data_1 = np.nan
data_2 = np.inf
# data_1和data_2的数据类型都是float
(二)两个nan是不相等的
np.nan == np.nan
# False
(三)检查数组中nan的个数
print(np.isnan(array_1))
# 将array_1判断是否为nan,并进行bool类型的赋值
print(np.count_nonzero(np.isnan(array_1)))
# np.count_nonzero()返回数组中判断为True的数据个数
(四)出现nan时,为了防止影响均值,会将nan替换成均值,活着直接删除缺失值的一行
numpy常用统计函数
- 求和:array.sum(axis=None)
- 均值:array.mean(axis=None)
- 中值:np.median(array,axis=None)
- 最大值/最小值:array.max(axis=None) / array.min(axis=None)
- 极差:np.ptp(array,axis=None)
- 标准差(平均值分散程度):array.std(axis=None)
案例:将数组中的nan替换为行或列的均值
import numpy as np
def fillNaNwithMeanValue(array_1):
'''
将array中的nan替换为每一列的均值
:param array_1: 未处理数组
:return: array_1 处理后数组
'''
for i in range(array_1.shape[1]): #a1.shape[1]为a1的列数
colItem = array_1[:,i] # colItem为当前这一列
nanNum = np.count_nonzero(colItem!=colItem)
if nanNum != 0:
colNoNaN = colItem[colItem==colItem] # 去除nan的一列
# print(colNoNaN)
colItem[colItem!=colItem] = colNoNaN.mean()
# print(colItem.mean())
return array_1
a1 = np.array([
[1,2,3,0],
[5,0,7,8],
[9,10,11,0]
]).astype(float) #nan为float类型,指定原数组为float类型
a1[a1==0] = np.nan
# print(a1)
print(fillNaNwithMeanValue(a1))