python三大库之–numpy(二)
文章目录
五,切片
ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样;
- 在 Python 中,slice 可以作为一个对象来使用。你可以创建一个 slice 对象,然后使用它来获取序列的片段。
参数:
- start 是切片开始的位置(包含该位置)。
- stop 是切片结束的位置(不包含该位置)。
- step 是切片的步长,即选取元素的间隔。
#numpy切片
def a1():
b=np.arange(10)
x= slice(1,len(b),2)
print(b)
print(x)
print(b[x])
a1()
[0 1 2 3 4 5 6 7 8 9]
slice(1, 10, 2)
[1 3 5 7 9]
六,高级索引
NumPy 中的高级索引指的是使用整数数组、布尔数组或者其他序列来访问数组的元素。相比于基本索引,高级索引可以访问到数组中的任意元素,并且可以用来对数组进行复杂的操作和修改。
6.1.整数数组索引
整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
适用于需要访问非连续元素或特定位置元素的场景。
注意:返回的新数组是一个副本,修改它不会影响原数组。
- 案例,取出一个矩阵的四角
def two():
array_one = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8], [9, 10, 11]])
print('原数组:\n',array_one)
array_one = array_one[[0,0,-1,-1], [0,-1,0,-1]]
print('这个数组的四个角元素是:')
print(array_one)
原数组:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
这个数组的四个角元素是:
[ 0 2 9 11]
6.2 布尔索引
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
arr = np.array([1,2,3,4,5,6,7,8,9,10])
bool_arr = arr > 5
print(bool_arr)
print(arr[bool_arr])
a=np.array([[1,2,3],[4,5,6],[7,8,9]])
print(a[:,a[1]>3])
[False False False False False True True True True True]
[ 6 7 8 9 10]
[[1 2 3]
[4 5 6]
[7 8 9]]
七,广播
广播(Broadcast)是 numpy 对不同形状(shape)的数组进行数值计算的方式, 对数组的算术运算通常在相应的元素上进行。这要求维数相同,且各维度的长度相同,如果不相同,可以通过广播机制,这种机制的核心是对形状较小的数组,在横向或纵向上进行一定次数的重复,使其与形状较大的数组拥有相同的维度。
- 维度匹配:如果两个数组的维度数不同,维度数较少的数组会在前面补上长度为 1 的维度。
arr = np.array([[1,2,3],[4,5,6]])
brr = np.array([[10,20,30]])
crr = arr + brr
print(crr)
[[11 22 33]
[14 25 36]]
- 形状匹配:如果两个数组在某个维度上的长度不同,但其中一个数组在该维度上的长度为 1,则该数组会沿着该维度进行广播。
d = np.array([[1], [2]]) # 形状: (2, 1)
e = np.array([10, 20, 30]) # 形状: (3,)
f = d + e
print(f)
[[11 21 31]
[12 22 32]]
- 案例 一维数组与标量
a = np.array([1,2,3])
b= 2
c= a+b
print(c)
[3 4 5]
- 二维数组与一维数组
a= np.array([[1,2,3],[4,5,6]])
b= np.array([10,20,30])
c= a+b
print(c)
[[11 22 33]
[14 25 36]]
- 二维数组与二维数组
a= np.array([[1,2,3],[4,5,6]])
b= np.array([[10,20,30],[40,50,60]])
c= a+b
print(c)
[[11 22 33]
[44 55 66]]
- 广播失败
a= np.array([[1,2,3],[4,5,6]])
b= np.array([10,20,30],[40,50,60],[70,80,90])
c= a+b
print(c)
Traceback (most recent call last):
File "f:\hqyj\python三大库代码\索引操作.py", line 59, in <module>
b= np.array([10,20,30],[40,50,60],[70,80,90])
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: array() takes from 1 to 2 positional arguments but 3 were given
八,遍历数组
8.1 遍历数组的第一维度
for i in arr:
遍历数组的第一维度,即按行或列的顺序逐个访问元素
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
for i in arr:
print(i)
操作.py
[1 2 3]
[4 5 6]
8.2 nditer逐个访问元素
nditer 是 NumPy 中的一个强大的迭代器对象,用于高效地遍历多维数组。nditer 提供了多种选项和控制参数,使得数组的迭代更加灵活和高效
8.2.1 order参数
arr = np.array([[1,2,3],[4,5,6]])
for i in np.nditer(arr,order='F'):
print(i)
arr = np.array([[1,2,3],[4,5,6]])
for i in np.ndi
1
4
2
5
3
6
1
2
3
4
5
6
8.2.2 flags参数
flags 参数用于指定迭代器的额外行为。
- multi_index: 返回每个元素的多维索引。
- external_loop: 返回一维数组而不是单个元素,减少函数调用的次数,从而提高性能。
arr = np.array([[1,2,3],[4,5,6]])
it = np.nditer(arr,flags=['multi_index'])
for i in it:
print(i)
print(it.multi_index)
1
(0, 0)
2
(0, 1)
3
(0, 2)
4
(1, 0)
5
(1, 1)
6
(1, 2)