数据分析角度快速了解Python之NumPy库分类用法

对于大部分数据处理,主要集中在以下要点:

(1)数据的创建

(2)子集构造、过滤、转换

(3)数据的整理、清洗

(4)数据的统计描述、分组运算

(5)数组的常用算法:排序、唯一化、集合运算

(6)数据的输入输出

本文从上面6个方面,分别介绍Numpy的常见用法。

NumPy最重要就是其N维数组对象(ndarray),是一个快速灵活的同构数据集容器,所有元素必须是相同类型。每一个ndarray对象都有一个shape属性(表示维度大小的元组),一个dtype属性(表示数组数据类型的对象)。

一、数据创建

(1)使用array函数

data = [6, 7.5, 8, 0, 1]
arr1 = np.array(data)

(2)验证数据创建结果

可以用属性shape 、ndim、dtype验证数据创建结果

Shape:各维度大小的元组

Ndim:说明数组的维度

dtype:说明数组数据类型(np.array会尝试为新建的这个数组推断出一个较为合适的数据类型)

astype方法明确地将一个数组从一个dtype转换成另一个dtype

arr = np.array([1, 2, 3, 4, 5])
arr.dtype
float_arr = arr.astype(np.float64)
float_arr.dtype

(3)zeros、ones函数创建全0或全1数组

np.zeros(10)
np.zeros((3, 6))

(4)empty函数创建没有任何具体值的数组

使用empty函数闯将没有任何具体指的数组,但是认为empty会返回全0数组的想法是不安全的。很多情况下,它返回的都是一些未初始化的垃圾值。

np.empty((2, 3, 2))

(5)使用arange函数

arrange函数格式:numpy.arange(start, stop, step, dtype = None)

start —— 开始位置,数字,可选项,默认起始值为0
stop —— 停止位置,数字
step —— 步长,数字,可选项, 默认步长为1,如果指定了step,则还必须给出start
dtype —— 输出数组的类型。 如果未给出dtype,则从其他输入参数推断数据类型

np.arange(15)
np.arange(1, 15)
np.arange(1, 15, 2)
np.arange(1, 5.2, 0.6)

numpy创建数据的函数总结

二、子集构造、过滤、转换

(1)基本索引和切片

基本索引和切片跟Python列表的功能差不多
 

data1 = np.array([1,3,5,7,9,0])
data1 [1]
data1 [2:5]

数组切片是原始数组的视图。这意味着数据不会被复制,视图上的任何修改都会直接反映到源数组上。

data1_slice=data1 [2:5]
data1_slice [1] = 12345
data1

切片[ : ]会给数组中的所有值赋值

data1_slice [:] = 64

想要得到的是ndarray切片的一份副本而非视图,就需要明确地进行复制操作,例如data1 [2:5].copy()

(2)高维度数组基本索引和切片

二位数组例子

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2d[2]
arr2d[0, 2]

多维数组列子:

在多维数组中,如果省略了后面的索引,则返回对象会是一个维度低一点的ndarray(它含有高一级维度上的所有数据)。

arr3d = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
arr3d[0]
arr3d[1, 0]

(3)切片索引

选取arr2d的前两行
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

选取arr2d的前两行的第2列至最后1列
arr2d[:2]

选取arr2d第2行的前2列
arr2d[:2, 1:]

选择第三列的前两行
arr2d[1, :2]

只有冒号表示选取整个轴
arr2d[:2, 2]
arr2d[:, :1]

(5)布尔型索引

假设我们有一个用于存储数据的数组以及一个存储姓名的数组(含有重复项)。在这里,我将使用numpy.random中的randn函数生成一些正态分布的随机数据。

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)

假设每个名字都对应data数组中的一行,而我们想要选出对应于名字"Bob"的所有行。跟算术运算一样,数组的比较运算(如==)也是矢量化的。因此,对names和字符串"Bob"的比较运算将会产生一个布尔型数组:

这个布尔型数组可用于数组索引:

(6)花式索引

花式索引(Fancy indexing)是一个NumPy术语,它指的是利用整数数组进行索引。假设我们有一个8×4数组:

为了以特定顺序选取行子集,只需传入一个用于指定顺序的整数列表或ndarray即可:

使用负数索引将会从末尾开始选取行:

三、数据的整理、清洗

(1)数学运算

对ndarray对象进行数学运算,其语法跟标量元素的运算一样。

data1 = np.array([1,3,5,7,9,0])
data1 * 10
data1 + data1
data2 = np.array([8,6,4,2,1,0])
data2 >data1

(2)元素级数组函数

四、数据的统计描述、分组运算

(1)统计描述

计算所有元素的乘积
np.prod(X)

计算平均值
np.mean(X)

计算中位数
np.median(X)

计算百分位,当q=50,相当于median, q=100相当于求最大值
np.percentile(big_array, q=50)

计算方差
np.var(big_array)

计算标准差
np.std(big_array)

(2)分组运算

(3)用布尔型数组分组运算方法

arr = np.random.randn(100)
(arr > 0).sum() 

五、数组的常用算法:排序、唯一化、集合运算

(1)排序

arr = np.random.randn(6)
arr.sort()

多维数组可以在任何一个轴向上进行排序,只需将轴编号传给sort

arr = np.random.randn(5, 3)
arr.sort(1)

顶级方法np.sort返回的是数组的已排序副本,而就地排序则会修改数组本身。

计算数组分位数最简单的办法是对其进行排序,然后选取特定位置的值:

large_arr = np.random.randn(1000)
large_arr.sort()
large_arr[int(0.05 * len(large_arr))] # 5% quantile

(2)唯一化

最常用的可能要数np.unique了,它用于找出数组中的唯一值并返回已排序的结果:

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']) In [207]: np.unique(names)

(3)集合运算

函数np.in1d用于测试一个数组中的值在另一个数组中的成员资格,返回一个布尔型数组。

values = np.array([6, 0, 0, 3, 2, 5, 6])
np.in1d(values, [2, 3, 6])

六、数据输入输出

NumPy能够读写磁盘上的文本数据或二进制数据。这一小节只讨论NumPy的内置二进制格式,因为更多的用户会使用pandas或其它工具加载文本或表格数据。

数组是以未压缩的原始二进制格式保存在扩展名为.npy的文件中

arr = np.arange(10)

np.save('some_array', arr)

通过np.load读取磁盘上的数组

np.load('some_array.npy')

通过np.savez可以将多个数组保存到一个未压缩文件中,将数组以关键字参数的形式传入即可

np.savez('array_archive.npz', a=arr, b=arr)

加载.npz文件时,你会得到一个类似字典的对象,该对象会对各个数组进行延迟加载

arch = np.load('array_archive.npz')

arch['b']

如果数据压缩的很好,就可以使用numpy.savez_compresse

np.savez_compressed('arrays_compressed.npz', a=arr, b=arr)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值