numpy学习 TASK2

it2025-03-23  9

数组索引和切片

1 常量1.1 numpy.nan1.2 numpy.inf1.3 numpy.pi1.4 numpy.e 2 副本与视图3 索引和切片3.1 整数索引3.2 切片索引3.3 dots索引3.4 整数数组索引3.5 布尔索引 4 数组迭代

1 常量

1.1 numpy.nan

numpy.nan 表示的是空值,两个numpy.nan是不相等的.而不相等的原因是numpy中的nan意为 not a number,表示的是一个不确定的数,所以两个不确定的数不可能比较大小。

import numpy as np print(np.nan==np.nan) print(np.nan!=np.nan) False True numpy.isnan() 测试元素是否是空值,并将结果作为布尔数组返回。 import numpy as np x=np.array([1,1,8,np.nan,10]) print(x) y=np.isnan(x) print(y) [ 1. 1. 8. nan 10.] [False False False True False] numpy.count_nozero()求的是一个数组中非零元素的个数 z = np.count_nonzero(y) print(z) 1 // An highlighted block var foo = 'bar'; // An highlighted block var foo = 'bar';

1.2 numpy.inf

numpy.inf 表示的是正无穷大,Inf = inf = infty = Infinity = PINF

1.3 numpy.pi

表示的是圆周率,pi

1.4 numpy.e

numpy.e 表示的是自然常数。

2 副本与视图

在 Numpy 中,返回结果是 副本 或者 视图。 副本和视图的区别: 副本是一个数据的完整的拷贝,如果我们对副本进行修改,它不会影响到原始数据,物理内存不在同一位置。 视图是数据的一个别称或引用,通过该别称或引用亦便可访问、操作原有数据,但原有数据不会产生拷贝。如果我们对视图进行修改,它会影响到原始数据,物理内存在同一位置。

赋值运算:numpy中不会为数组和数组中的任何元素创建副本。(即改变的是原始的,无副本)numpy.ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据。数组切片操作返回的对象只是原数组的视图。 import numpy as np x=np.array([1,2,3,4,5,6,7,8]) y=x y[0]=-1 print(x) print(y) [-1 2 3 4 5 6 7 8] [-1 2 3 4 5 6 7 8] x1=np.array([1,2,3,4,5,6,7,8]) y1=x1.copy() y1[0]=-1 print(x1) print(y1) [1 2 3 4 5 6 7 8] [-1 2 3 4 5 6 7 8]

3 索引和切片

3.1 整数索引

索引指的是用方括号([])加序号的形式引用单个数组元素整数索引:获取数组的单个元素,指定元素的索引即可,x[i];,x[i][j]等价于 x[i,j]) x2=np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) y2=x2 y2[::2,:3:2]=-1 print(x2) print(y2) [[-1 12 -1 14 15] [16 17 18 19 20] [-1 22 -1 24 25] [26 27 28 29 30] [-1 32 -1 34 35]] [[-1 12 -1 14 15] [16 17 18 19 20] [-1 22 -1 24 25] [26 27 28 29 30] [-1 32 -1 34 35]] #整数索引 import numpy as np x3 = np.array([1, 2, 3, 4, 5, 6, 7, 8]) print(x3[2]) # 3 x4 = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) print(x4[2]) # [21 22 23 24 25] print(x4[2][1]) # 22 print(x4[2, 1]) # 22

3.2 切片索引

切片:是指抽取数组的一部分元素生成新数组。对 python 列表进行切片操作得到的数组是原数组的副本,而对 Numpy 数据进行切片操作得到的数组则是指向相同缓冲区的视图。 切片索引:x[ start:stop:step,start:stop:step ]切片索引,逗号前是行,后面是列;下表从0开始,省去表示默认从第0个数字开始;为左开右闭;-1表示最后一个元素。并且还可以通过对每个以逗号分隔的维度执行单独的切片

import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) print(x[0:2]) # [1 2] print(x[1:5:2]) # [2 4] print(x[2:]) # [3 4 5 6 7 8] print(x[:2]) # [1 2] print(x[-2:]) # [7 8] print(x[:-2]) # [1 2 3 4 5 6] print(x[:]) # [1 2 3 4 5 6 7 8] print(x[::-1]) # [8 7 6 5 4 3 2 1] #二维数组切片 x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) print(x[0:2]) [[11 12 13 14 15] [16 17 18 19 20]]

3.3 dots索引

NumPy 允许使用表示足够多的冒号来构建完整的索引列表。

x[1,2,…] 等于 x[1,2,:,:,:]x[…,3] 等于 x[:,:,:,:,3]x[4,…,5,:] 等于 x[4,:,:,5,:] import numpy as np x = np.random.randint(1, 100, [2, 2, 3]) print(x) # [[[ 5 64 75] # [57 27 31]] # # [[68 85 3] # [93 26 25]]] print(x[1, ...]) # [[68 85 3] # [93 26 25]] print(x[..., 2]) # [[75 31] # [ 3 25]]

3.4 整数数组索引

x[r, c]:r和c都是数组,表示行和列,表示的是对应坐标(r和c是一一对应)x[r]:r若为高维数组,表示的是这个输出的数组形状,但是r仍然只表示行。x[r, c]:r和c都是数组,表示行和列,表示的是对应坐标(r和c是一一对应)numpy. take(a, indices, axis=None, out=None, mode=‘raise’) Take elements from an array along an axis. axis=0 /1 表示的是按第0轴/1轴 从数组中提取元素。

使用切片索引(视图),生成的数组视图将始终是原始数组的子数组,但是整数数组索引(副本),不是其子数组,是形成新的数组。

x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) r = [0, 1, 2] c = [2, 3, 4] y = x[r, c] print(y) # [13 19 25] x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) r = np.array([[0, 1], [3, 4]]) print(x[r]) #等价于print(np.take(x, r, axis=0)) # [[[11 12 13 14 15] # [16 17 18 19 20]] # # [[26 27 28 29 30] # [31 32 33 34 35]]] # 获取了 5X5 数组中的四个角的元素。 # 行索引是 [0,0][4,4],而列索引是 [0,4][0,4]。 r = np.array([[0, 0], [4, 4]]) c = np.array([[0, 4], [4, 0]]) y = x[r, c] print(y) # [[11 15] # [35 31]] x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) r = [0, 1, 2] c = [2, 3, 4] y = np.take(x, [r, c]) print(y) # [[11 12 13] # [13 14 15]] 表示默认按行选取,选取的是两组下标分别是[0,1,2],[2,3,4]

3.5 布尔索引

表示的是通过布尔数组索引数目数组

logical_not(布尔数组):非运算,True改为Falsenp.logical_and(express1, express2) :与运算,同时成立 import numpy as np x = np.array([1, 2, 3, 4, 5, 6, 7, 8]) y = x > 5 print(y) # [False False False False False True True True] print(x[x > 5]) # [6 7 8] x = np.array([np.nan, 1, 2, np.nan, 3, 4, 5]) y = np.logical_not(np.isnan(x)) print(x[y]) # [1. 2. 3. 4. 5.] import numpy as np import matplotlib.pyplot as plt x = np.linspace(0, 2 * np.pi, 50) y = np.sin(x) print(len(x)) # 50 plt.plot(x, y) mask=y>=0 #此处返回一个不二数组 print(len(x[mask])) print(mask) plt.plot(x[mask],y[mask],'bo') 50 25 [ True True True True True True True True True True True True True True True True True True True True True True True True True False False False False False False False False False False False False False False False False False False False False False False False False False]

4 数组迭代

apply_along_axis(func1d, axis, arr)对沿给定轴的一维切片应用一个函数。 x = np.array([[11, 12, 13, 14, 15], [16, 17, 18, 19, 20], [21, 22, 23, 24, 25], [26, 27, 28, 29, 30], [31, 32, 33, 34, 35]]) y = np.apply_along_axis(np.sum, 0, x) #沿着列计算 print(y) # [105 110 115 120 125 y = np.apply_along_axis(np.sum, 1, x) print(y) # [ 65 90 115 140 165] #沿着行计算 def my_func(x): return (x[0] + x[-1]) * 0.5 y = np.apply_along_axis(my_func, 1, x) print(y) #[13. 18. 23. 28. 33.] 交换(反转)二维数组中的两列(行) #索引和切片 arr = np.arange(9).reshape(3, 3) x = arr[:, [2, 1, 0]] print(x) # [[2 1 0] # [5 4 3] # [8 7 6]] x = arr[::-1, :] print(x) # [[6 7 8] # [3 4 5] # [0 1 2]]
最新回复(0)