目录
前言
本文介绍了数据处理包numpy的基础用法以及用于数据处理的实际案例。
一、Numpy是什么?
numpy是一款基于python的数据处理工具,该工具是为了解决数据分析任务而创建的。
二、使用步骤
1.numpy中的array和python列表的区别
代码如下:
import numpy as np
l1=list(range(10))
l2=np.asarray(l1)
print(f"list:{l1}\n array:{l2}")
结果:
结果打印出来可见,二者非常相似,list中间有逗号,而array却没有。实际上,array和list区别很大。在Python中,NumPy的数组(numpy.array
)和列表(list
)是不同的数据结构,它们具有不同的实现方式和特性。
-
存储方式:
- 列表是一种动态数组,它存储的是对象的引用。列表的元素可以是不同类型的对象,因此列表在存储和访问上的效率较低。
- NumPy数组是一种固定类型的数组,它在内存中以连续块的形式存储数据。因为元素类型固定,数组在存储和访问上的效率较高。
-
运算方式:
- 列表通常需要使用循环来遍历和处理每个元素。列表的操作是逐个元素进行的,例如使用
for
循环或列表推导式。 - NumPy数组支持向量化操作,可以直接对整个数组进行操作,而无需逐个元素处理。这是因为NumPy数组的底层实现是通过高度优化的C语言代码,可以进行并行化和矢量化计算,从而提高运算效率。
- 列表通常需要使用循环来遍历和处理每个元素。列表的操作是逐个元素进行的,例如使用
由于NumPy数组的向量化操作,可以在底层进行高度优化的计算,因此在处理大量数据和进行数值计算时,通常比列表更高效。另外,NumPy还提供了许多针对数组的强大函数和操作,如广播(broadcasting)、切片(slicing)、聚合(aggregation)等,这些功能在列表中是不可用的。
需要注意的是,列表和NumPy数组都有各自适用的场景。列表适用于存储和操作各种类型的对象,以及进行动态操作和更灵活的数据结构。而NumPy数组适用于进行数值计算、科学计算和大规模数据处理,特别是当处理多维数据时,NumPy的优势更加明显。
一个例子:
import time
import numpy as np
# 记录代码块的起始时间
t0 = time.time()
list1=list(range(100))
# 执行一些操作
for _ in range(1000000):
list1=list(map(lambda x:x+1,list1))
pass
# 计算list代码块执行的时间
t1=time.time()
list_time = t1 - t0
arr1=np.asarray(list1)
for _ in range(1000000):
arr1+=1
t2=time.time()
arr_time=t2-t1
print("list代码块执行时间:", list_time)
print("array代码块执行时间:", arr_time)
结果如下:
可见,在大体量数据下,二者进行同样操作的时间差距是非常明显的,在这方面,可以并行计算的array有着明显优势
2.操作数据
- 对维度操作:最常用reshape和concatenate,此外还有很多,比如
np.column_stack(), np.row_stack()
np.vstack(), np.hstack(), np.stack()
此处不再一一介绍 -
import numpy as np a=np.array(range(100)) print(a) print(a.reshape(2,5,10))
import numpy as np
a=np.array(range(20))
a=a.reshape(2,2,5)
b=np.array(range(20,40))
b=b.reshape(2,2,5)
print("第一维度叠加:\n", np.concatenate([a, b], axis=0))
print("第二维度叠加:\n", np.concatenate([a, b], axis=1))
print("第三维度叠加:\n", np.concatenate([a, b], axis=2))
另外有一个函数flatten,用于将多维转为一维,经常用于神经网络中对样本特征的展平,其他函数用到的时候再查吧
三、数据处理
一份数据,我们拿到手后往往会发现有很多缺陷,是不能直接就用于计算分析的,还需要提前进行处理,这就是数据清洗,或者说预处理
一份脏数据有如下几个特征:
- 数据缺失
- 数据异常
- 格式错误
比如这样一份数据
raw_data = [
["Name", "StudentID", "Age", "AttendClass", "Score"],
["小明", 20131, 10, 1, 67],
["小花", 20132, 11, 1, 88],
["小菜", 20133, None, 1, "98"],
["小七", 20134, 8, 1, 110],
["花菜", 20134, 98, 0, None],
["刘欣", 20136, 12, 0, 12]
]
就包含了上述几种常见的特征,首先我们要进行处理,先将列表转化为数组,再将数据缺失值填充为该列中位数,然后看”Age“列,明显98异常不符合实际,将该值替换为该列平均数,处理得到如下
raw_data = [
["Name", "StudentID", "Age", "AttendClass", "Score"],
["小明", 20131, 10, 1, 67],
["小花", 20132, 11, 1, 88],
["小菜", 20133, None, 1, "98"],
["小七", 20134, 8, 1, 110],
["花菜", 20134, 98, 0, None],
["刘欣", 20136, 12, 0, 12]
]
data=np.array(raw_data)
data_process=[]
for i in range(len(raw_data)):
if i==0:
continue
data_process.append(data[i,1:])
pass
data_process=np.asarray(data_process).astype(float)
def median_process(data_process):
col_median=np.nanmedian(data_process,axis=0)
data_process[np.isnan(data_process)]=np.broadcast_to(col_median,data_process.shape)[np.isnan(data_process)]
return data_process
pass
data_process=median_process(data_process)
print(data_process)
[[2.0131e+04 1.0000e+01 1.0000e+00 6.7000e+01]
[2.0132e+04 1.1000e+01 1.0000e+00 8.8000e+01]
[2.0133e+04 1.1000e+01 1.0000e+00 9.8000e+01]
[2.0134e+04 8.0000e+00 1.0000e+00 1.1000e+02]
[2.0134e+04 9.8000e+01 0.0000e+00 8.8000e+01]
[2.0136e+04 1.2000e+01 0.0000e+00 1.2000e+01]]
[Finished in 1.5s]
就差不多了,注意这只是非常简单的例子,实际上有很多的问题处理起来并非这么简单,需要不断的尝试,要你主动去看清数据结构
总结
以上就是今天要讲的内容,本文仅仅简单介绍了numpy的使用,而numpy提供了大量能使我们快速便捷地处理数据的函数和方法。