Numpy库(三):数组处理

本文详细介绍了Numpy库中数组的基础操作,包括索引、切片、迭代和遍历。通过示例展示了如何访问单个元素、使用切片抽取部分数据、使用迭代遍历数组以及利用apply_along_axis函数按行或列进行特定操作。此外,还涉及到了逻辑判断和排序方法,如all()、any()函数以及sort()、argsort()函数的应用。
摘要由CSDN通过智能技术生成


一、索引、切片与迭代、遍历

(1)索引机制

数组索引是指用方括号加序号的形式引用单个数组元素。新建数组后,会自动生成和数组大小一致的索引。

同Python列表的索引相似,Numpy中的数组索引同样可以使用负数。
一维数组索引
如若需要同时输出多个元素,可以将所需的元素索引以一个列表的形式传入。

import numpy as np
a = np.arange(10,16)
print('输出原数组元素:', a)
print('输出第三个元素:', a[2])
print('输出负一个元素:', a[-1])
print('输出多个元素  :', a[[1, 3, 4]])

输出结果如下:

输出原数组元素: [10 11 12 13 14 15]
输出第三个元素: 12
输出负一个元素: 15
输出多个元素  : [11 13 14]

二维数组又称为矩阵,矩阵是以行和列组成的矩形数组。二维数组的索引用一对值来表示: [行索引, 列索引]
二维数组

import numpy as np
a = np.arange(10, 19).reshape(3, 3)
print('输出原数组元素:\n', a)
print('一行二列的元素:', a[0, 1])

输出结果如下:

输出原数组元素:
 [[10 11 12]
 [13 14 15]
 [16 17 18]]
一行二列的元素: 11

(2)切片方法

切片操作是指抽取数组的部分元素从而生成新数组。切片的句法是通过冒号分隔切片参数 start:stop:step 来进行切片操作

  • 在切片中,包含start,但不包括stop元素
  • 如省略不填start参数,则默认为0
  • 如省略不填stop参数,则默认为最大索引值
  • 如省略不填step参数,则默认为1
  • 对于二维数组,依旧需要分行和列进行切片
  • 对于二维数组,若抽取的行或列的索引不连续,则可以将所需的索引以一个列表的形式传入
    二维数组切片
import numpy as np
a = np.arange(10, 16)
b = np.arange(10, 19).reshape(3, 3)

print('*'*10, '一维数组切片', '*'*10)
print('原数组:', a)
print('切片1:', a[::])
print('切片2:', a[0:5:2])
print('切片3:', a[::2])
print('*'*10, '二维数组切片', '*'*10)
print('切片1:\n', b[:2,:2])
print('切片2:\n', b[[0,2],:])
print('切片3:\n', b[0,:])

输出结果如下:

********** 一维数组切片 **********
原数组: [10 11 12 13 14 15]
切片1[10 11 12 13 14 15]
切片2[10 12 14]
切片3[10 12 14]
********** 二维数组切片 **********
切片1[[10 11]
 [13 14]]
切片2[[10 11 12]
 [16 17 18]]
切片2[10 11 12]

(3)迭代方法

对Numpy数组元素的迭代可以直接使用for循环即可。所谓迭代就是依次序获取到数组中的每个元素。

import numpy as np
a = np.arange(10, 16)
b = np.arange(10, 19).reshape(3, 3)

print('*'*10, '一维数组迭代', '*'*10)
# 获取每个元素
for i in a:
    print(i, end='  ')
print()

print('*'*10, '二维数组迭代', '*'*10)
print('获取每行元素')
for row in b:
    print(row)
print('获取所有元素')
for i in b.flat:
    print(i, end='  ')
print()

输出结果如下:

********** 一维数组迭代 **********
10  11  12  13  14  15  
********** 二维数组迭代 **********
获取每行元素
[10 11 12]
[13 14 15]
[16 17 18]
获取所有元素
10  11  12  13  14  15  16  17  18  

(4)遍历方法

除了采用for循环外,可以采用Numpy内置的函数**apply_along_axis()**进行按行或按列遍历操作:

  • 传入的第一个参数为操作函数名,即对遍历元素进行的操作
  • 传入的第二个参数axis可选值为0或1,0表示按列操作而1则是按行操作
  • 传入的第三个参数arr为所遍历的数组
import numpy as np
b = np.arange(10, 19).reshape(3, 3)

# 按列求平均值
print('按列求平均:\n', np.apply_along_axis(np.mean, axis=0, arr=b))
print('按行求平均:\n', np.apply_along_axis(np.mean, axis=1, arr=b))

输出结果如下:

按列求平均:
 [13. 14. 15.]
按行求平均:
 [11. 14. 17.]

其中,传入的操作函数可以为自定义函数。

二、逻辑、排序

(1)逻辑判断

Numpy内置了用于逻辑判断的函数all()和any()

  • all()函数用于判断数组是否所有元素都为True
  • any()函数用于判断数组中是否有任一元素为True
  • 返回值为布尔值
  • 通常逻辑判断会与布尔运算进行配合使用。
import numpy as np
a = np.array([True, True, True])
b = np.array([True, False, True])
c = np.array([False, False, False])

print('全真数组判断是否任意为真  :', np.all(a))
print('非全真数组判断是否任意为真:', np.all(b))
print('非全真数组判断是否任一为真:', np.any(b))
print('全假数组判断是否任一为真  :', np.any(c))

输出结果如下:

全真数组判断是否任意为真  : True
非全真数组判断是否任意为真: False
非全真数组判断是否任一为真: True
全假数组判断是否任一为真  : False

(2)排序方式

在Numpy中主要用于排序的函数为sort()argsort()

  • sort()函数返回输入数组的排序副本
  • argsort()函数返回输入数组元素的索引
  • 传入参数axis表示按行或按列进行排序,可选值为1(按行)或0(按列)

直接排序的方式如下:

import numpy as np
a = np.array([
    [8, 5, 6, 7],
    [3, 1, 4 ,2],
])
print('直接排序(按行):\n', np.sort(a, axis=0))
print('直接排序(按行):\n', a[a.sort(axis=0)])
print('直接排序(按列):\n', np.sort(a, axis=1))
print('直接排序(按列):\n', a[a.sort(axis=1)])

输出结果如下:

直接排序(按行)[[3 1 4 2]
 [8 5 6 7]]
直接排序(按行)[[[3 1 4 2]
  [8 5 6 7]]]
直接排序(按列)[[1 2 3 4]
 [5 6 7 8]]
直接排序(按列)[[[1 2 3 4]
  [5 6 7 8]]]

根据索引进行排序的方式如下:

import numpy as np
b = np.random.randn(3,3)
print('原数组(按行)  :\n', b)
print('索引排序(按行):\n', b.argsort(axis = 1))
print('索引排序(按列):\n', b.argsort(axis = 0))
print('索引排序(按行):\n', np.argsort(b, axis=1))
print('索引排序(按列):\n', np.argsort(b, axis=0))

输出的结果如下,此函数的返回值为排序元素的索引值:

原数组(按行)[[ 2.20612425 -0.75872485  1.03808758]
 [-0.24576707  0.04071721  0.25264738]
 [-0.35807198  0.51390736  0.37083124]]
索引排序(按行)[[1 2 0]
 [0 1 2]
 [0 2 1]]
索引排序(按列)[[2 0 1]
 [1 1 2]
 [0 2 0]]
索引排序(按行)[[1 2 0]
 [0 1 2]
 [0 2 1]]
索引排序(按列)[[2 0 1]
 [1 1 2]
 [0 2 0]]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值