Numpy:读取本地文件及数据处理

轴(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))


猜你喜欢

转载自blog.csdn.net/Dae_Lzh/article/details/119821077