numpy 创建加一行_数据处理利器NumPy初识(二)

回顾

在数据处理利器NumPy初识(一)中,我们介绍了NumPy的基本概念、基础数据结构以及NumPy数组,也就是ndarray的几种常见创建方法。今天我们介绍一下NumPy的几个常用函数和ndarray的索引与切片。

NumPy常用函数

NumPy中有很多用于处理ndarray数据的函数,常用的包括reshape()、resize()、copy()、astype()、stack()、split()等,下面我们分别来看一下这几个函数的功能和用法。

  • 改变数组形状:reshape()、resize()、T

reshape()函数的作用是重新调整ndarray的行数、列数、维数,根据传入的参数个数不同,可以重置成不同维数的数组,但是新的形状必须与原来的形状兼容,即相乘后必须等于原数组中元素的总数量,否则会报错。基本用法如下。​

import numpy as nparr1 = np.arange(12)print(arr1)print("---------------")arr2 = arr1.reshape(3, 2, 2)print(arr2)print("---------------")arr3 = arr2.reshape(3, 4)print(arr3)

以上代码首先创建了一个一维ndarray,共12个数,然后使用reshape()函数将一维ndarray调整成3*2*2的三维ndarray,再对新的三维ndarray调整成3*4的二维ndarray,可以看到,不管做怎样的调整,相乘后的结果都是源数组的元素总个数12。运行结果如下所示。

3952da07929e8e1fc0f9c7585e0cf073.png

reshape()函数

resize()函数与reshape()函数的作用一样,也可以重新调整ndarray的行数、列数、维数,不同的是reshape()函数需要兼容原来的形状,少于或超出原数组个数会报错,而resize()函数不会报错,当少于时,resize()函数会自动截断,当超出时,resize()函数会循环copy原数组中的值进行填充,直至将新ndarray填充满。我们创建一个10个数的一维ndarray,将形状调整成3*4共12个数,代码如下。​

import numpy as nparr = np.arange(10)print(arr)print("---------------")np.resize(arr, (3, 4)) # 数量不够时会循环使用直至充满形状print(np.resize(arr, (2, 6)))print("---------------")print(arr.resize(2, 6))print(arr)

运行结果如下所示,新数组共3*4=12个数,大于原数组的10个数,多出的两个数就会从原数组中取出前两个数进行填充。另外,调用ndarray本身的resize()方法不会生成新ndarray,但会改变ndarray形状,调用后再次打印arr,会发现它的形状已经被改变了,并且多余的位置以0填充。

ed07348b501723c732a35ec3eb5306ad.png

resize()函数

T的作用是转置, 对二维ndarray来说,就是交换行列,需要注意的是T并不是函数,后面不要加括号。​

import numpy as nparr1 = np.arange(12).reshape(3, 4)print(arr1)print("---------------")arr2 = arr1.Tprint(arr2)

运行结果如下所示。

1be7414b8b9002a0cec93f00d3e4942d.png

转置T

  • ndarray复制:copy()

ndarray的复制使用NumPy的copy()函数,当我们把一个ndarray复制给新的ndarray时,两者是紧密关联的,当原ndarray改变时,新ndarray也会随之改变,但一般我们使用复制并不想要他们有关联性,这个时候使用copy()函数就可以解决这个问题,其实这就是NumPy中的浅copy和深copy。下面我们看一下两者的区别。

import numpy as nparr1 = np.arange(10)arr2 = arr1 # 指向同一个数组print(arr1 == arr2)arr1[2] = 100print(arr1)print(arr2)print("---------------")arr3 = arr1.copy()print(arr1 == arr3)arr1[3] = 1000print(arr1)print(arr3)

运行结果如下图所示。首先不管是赋值还是使用copy()函数生成新ndarray,两者的值都是相等的。区别就是改变原数组时,一个会随之改变,一个不会。

9b1519c5f83e8aa993260351b4d30f55.png

copy()函数

  • ndarray数据类型转换:astype()

NumPy中支持的数据类型比Python内置的类型要更多,下表列举了常用的NumPy基本数据类型。

9289586ba8979a899881849d10b9b9b9.png

常见NumPy数据类型

NumPy中设置ndarray数据类型使用astype()函数,基本用法如下。​

import numpy as nparr1 = np.arange(10, dtype=float)print(arr1, arr1.dtype)arr2 = arr1.astype(np.int64)print(arr2, arr2.dtype)arr3 = arr2.astype(np.string_)print(arr3, arr3.dtype)

运行结果如下所示。

86ebfcba2364f150001827226c7e14e4.png

astype()函数

  • ndarray合并:stack()

ndarray的合并使用NumPy的stack()函数,传入要合并的ndarray,axis参数表示按行合并或按列合并,默认axis=0按行合并,axis=1时按列合并。按行合并或按列合并还可以使用hstack()函数或vstack()函数。基本用法如下。​

import numpy as npa = np.arange(5)b = np.arange(5, 9)print(a)print(b)print("---------------")print(np.hstack((a, b, a))) # 横向连接print("---------------")c = np.array([[1], [2], [3]])d = np.array([['a'], ['b'], ['c']])print(c)print(d)print("---------------")print(np.vstack((c, d))) # 纵向连接print("---------------")# 默认纵向# print(np.stack((a, b), axis=1)) # 列数不一致,会报错b = np.arange(5, 10)print(np.stack((a, b, a), axis=1))

运行结果如下。需要注意的是,在合并时,必须保证要合并的几个ndarray在合并方向上的数量是一致的,否则会报错。

b4c2b778ee883c4c2fb40af6465175b1.png

stack()函数

  • ndarray拆分:split()

NumPy中使用split()函数对ndarray进行拆分,与合并的stack()函数类似,axis表示拆分方向,同时,也有hsplit()函数和vsplit()函数分别按行或按列拆分。split()相关函数的基本用法如下。​

import numpy as nparr = np.arange(16).reshape(4, 4)print(arr)print("---------------")print(np.hsplit(arr, 2))print(np.split(arr, 2, axis=1))print("---------------")print(np.vsplit(arr, 2))print(np.split(arr, 2))

运行结果如下。拆分时必须保证拆分的数量能等分,否则会报错。

ae60270bf2dbbefef63175bb662092f4.png

split()函数

NumPy的索引和切片

NumPy中的索引和切片的运用包括基本索引和切片以及布尔型索引和切片。

  • 基本索引和切片

​ NumPy中ndarray的基本索引和切片与Python中的数组类似,我们分别以一维、二维、三维ndarray作为代表看一下NumPy中ndarray的基本索引和切片。

1、一维ndarray的基本索引和切片​

import numpy as nparr = np.arange(10)print(arr)print("---------------")# 直接索引,打印arr索引为2的值print(arr[2])print("---------------")# 切片,打印arr中从索引5开始到最后一个数的值(包括5)print(arr[5:])print("---------------")print("---------------")# 切片,打印arr中从开始到索引5的值(不包括5)print(arr[:5])print("---------------")# 切片,打印arr中从第一个数开始以2位步长到最后一个数的值print(arr[::2])

运行结果如下。

0db3e17a7c6074e8b3ebd0f689952d3a.png

一维ndarray索引和切片

2、二维ndarray的基本索引和切片​

import numpy as nparr = np.arange(15).reshape(3, 5)print(arr)print("---------------")# 索引,打印行索引为1的那一行的值print(arr[1])print("---------------")# 索引,打印行索引为1,列索引为1的值print(arr[1][1])print(arr[1, 1])print("---------------")# 切片,打印行索引从开始到行索引为2(不包括2)的几行值print(arr[:2])print("---------------")# 切片,打印行索引从第一行到行索引为2(不包括2),列索引从2开始(包括2)到最后一列的值print(arr[:2, 2:])

运行结果如下。

4d9769e4b69aa6104ee8623f305e96da.png

二维ndarray索引和切片

3、三维ndarray的基本索引和切片​

import numpy as nparr = np.arange(16).reshape(4, 2, 2)print(arr)print("---------------")# 索引print(arr[1][1][1])print("---------------")# 切片print(arr[1:])

运行结果如下。

223ae13cf04297b4417884d1fc3cee1a.png

三维ndarray索引和切片

四维以上的ndarray使用索引和切片的方法以此类推即可。

  • 布尔型索引和切片

​ NumPy中还有一种布尔型的索引和切片,布尔型有True和False两个值,对ndarray使用布尔型索引和切片会取出布尔值为True的值,需要注意的是用于索引和切片的布尔型数组的长度和待操作的ndarray的操作轴的大小必须一致。另外,布尔型数组也可与切片,整数(整数序列)一起使用。基本用法如下。​

import numpy as nparr = np.arange(12).reshape(3, 4)print(arr)print("---------------")x = np.array([True, False, True])y = np.array([True, True, False, False])print(x)print(y)print("---------------")# 对第一维(这里是行)操作print(arr[x])print("---------------")# 对第二维(这里是列)操作print(arr[:, y])print("---------------")print(arr>6)print("---------------")print(arr[arr>6])

对第一维操作时,可省略后面的维度,但对非第一维操作时,其他维度上的值不能忽略,可用“:”表示其他维度上的所有值。除了显示的设置布尔型数组进行索引和切片,还可以使用条件表达式,上述代码中我们打印了arr>6的值,可以看到,返回的是一个与arr形状一致的布尔型ndarray,再使用新生成的布尔型ndarray对arr进行索引,得到的将会是一个满足条件的一维ndarray。运行结果如下所示。

640d095e1e452648abd2acc948df352a.png

布尔型索引和切片

总结

以上介绍了NumPy中的几个常用函数以及ndarray的索引和切片,下次我们开始介绍NumPy中的各种数据运算处理。感谢大家的关注,欢迎批评指正,一起交流~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值