Python numpy数组元素的访问及数组的增删改查功能详解
目录
- numpy ndarray数组元素的访问及数组的增删改查
- ndarray数组元素的访问
- 一维ndarray的元素访问
- 二维ndarray的元素访问
- ndarray数组元素的增删改查
- ndarray数组元素的增加 np.append
- np.insert
- np.hstack和np.vstack
- ndarray数组元素的删除
- np.delete()删除指定位置的元素
- 根据条件删除元素(过滤)
- np.unique删除重复元素
- 修改ndarray中的元素
- 直接索引赋值
- 切片赋值
- 布尔索引赋值
- 使用 np.put() 按索引批量赋值
- 使用 np.where() 条件替换
- 修改为特殊值
- numpy中的裁剪函数Clip
numpy ndarray数组元素的访问及数组的增删改查
ndarray数组元素的访问
- ndarray 切片操作的基本语法和列表类似,为 arr[start:stop:step],其中 star、stop 和 step 是可选参数。
- 对于多维数组,每个维度都可以单独指定切片范围,语法为 arr[dim1_start:dim1_stop:dim1_step, dim2_start:dim2_stop:dim2_step, …]。
- start:切片起始索引,包含该索引对应的元素,默认值为 0。负数索引表示从数组末尾开始计数。
- stop:切片结束索引,不包含该索引对应的元素,默认值为数组的长度。负数索引表示从数组末尾开始计数。
- step:切片步长,默认值为 1。正数表示从左到右选取元素,负数表示从右到左选取元素。
- 得到的结果仍是ndarray。
一维ndarray的元素访问
0个冒号的,stop
code: import numpy as np nd1 = np.array(range(8)) print("nd1[3]: %d, nd1[-2]: %d" % (nd1[3], nd1[-2])) result: nd1[3]: 3, nd1[-2]: 6
1个冒号的,start and stop
code: import numpy as np nd1 = np.array(range(8)) print("nd1[:3]: %s, nd1[2:4]: %s, nd1[4:]: %s, nd1[:]: %s" % (nd1[:3], nd1[2:4], nd1[4:], nd1[:])) result: nd1[:3]: [0 1 2], nd1[2:4]: [2 3], nd1[4:]: [4 5 6 7], nhttp://www.devze.comd1[:]: [0 1 2 3 4 5 6 7]
2个冒号的,start,stop,step
code: import numpy as np nd1 = np.array(range(8)) import numpy as np nd1 = np.array(range(8)) print("nd1[::3]: %s, nd1[2::4]: %s, nd1[:4:]: %s, nd1[:6:2]: %s,"% (nd1[::3], nd1[2::4], nd1[:4:], nd1[:6:2])) print("nd1[2:5:]: %s, nd1[1::]: %s, nd1[js1:7:3]: %s, nd1[::]: %s" % (nd1[2:5:], nd1[1::], nd1[1:7:3], nd1[::])) result: nd1[::3]: [0 3 6], nd1[2::4]: [2 6], nd1[:4:]: [0 1 2 3], nd1[:6:2]: [0 2 4], nd1[2:5:]: [2 3 4], nd1[1::]: [1 2 3 4 5 6 7], nd1[1:7:3]: [1 4], nd1[::]: [0 1 2 3 4 5 6 7]
二维ndarray的元素访问
访问单个元素,[行,列]指明要访问的元素的行列
code: import numpy as np nd1 = np.array([[1, 2, 3], [4, 5, 6]]) print("nd1[1,2]: %s" % nd1[1, 2]) result: nd1[1,2]: 6
- []访问一行或者多行
- []中一个数指行,有逗号,逗号前指行,后指列
- 行和列分别可以用切片,列表标识多行或者多列
code: import numpy as np nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("nd1[1]: %s", nd1[1]) # 一个参数指行 print("nd1[1, :]", nd1[1, :]) # 用中间逗号的方式指定行和列 print("nd1[0:2, :]", nd1[0:2, :]) # 用切片的方式指定多行 print("nd1[[0,1], :]", nd1[0:2, :]) # 用列表的方式指定多行 result: nd1[1]: [4 5 6] nd1[1, :]: [4 5 6] nd1[0:2, :]: [[1 2 3] [4 5 6]] nd1[[0,1], :]: [[1 2 3] [4 5 6]]
- 访问一列或者多列
- 访问某一列[:, 列号]
- 访问编程某一列[:, 切片或者列表]访问多列
code: import numpy as np nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print("nd1[:, :]:", nd1[:, :]) # 所有行, 所有列 print("nd1[:, 1]:", nd1[:, 1]) # 第1列 print("nd1[1, 0:2]:", nd1[1, 0:2]) # 第一行的0列和1列 print("nd1[[0,1], [0, 2]]:", nd1[[0, 1], [0, 2]]) # 第一行的0列和1列 result: nd1[:, :]: [[1 2 3] [4 5 6] [7 8 9]] nd1[:, 1]: [2 5 8] nd1[1, 0:2]: [4 5] nd1[[0,1], [0, 2]]: [1 6]
ndarray数组元素的增删改查
ndarray数组元素的增加 np.append
-np.append(arr, values, axis=None),values为要添加的数组,注意要和arr的shape匹配才能添加。
生成新的数据,原数据不变,values为要添加的数组,注意要和arr的shape匹配才能添加。
code: import numpy as np nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) nd2 = [[11, 22, 33]] # 上下方向添加, 要是一行数据的形式 nd3 = [[44, 444], [55, 555], [66, 666]] new_nd1 = np.append(nd1, nd2, axis=0) # 上下方向添加 print(new_nd1) new_nd2 = np.append(nd1, nd3, axis=1) # 左右方向添加 print(new_nd2) result: [[ 1 2 3] [ 4 5 6] [ 7 8 9] [11 22 33]] [[ 1 2 3 44 444] [ 4 5 6 55 555] [ 7 8 9 66 666]]
np.insert
- np.insert() 函数可以在数组的指定位置插入值,返回一个新的数组。
- np.insert(arr, obj, values, axis=None)code: import numpy as np nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # insert(arr, obj, values, axis=None) nd2 = np.insert(nd1, 1, [11, 22, 33], axis=0) nd3 = np.insert(nd2, 3, [[44, 55, 66]], axis=0) nd4 = np.insert(nd1, 1, [11, 22, 33], axis=1) nd5 = np.insert(nd4, 3, [[44, 55, 66]], axis=1) print("nd3:\n", nd3) print("nd5:\n", nd5) result: nd3: [[ 1 2 3] [11 22 33] [ 4 5 6] [44 55 66] [ 7 8 9]] nd5: [[ 1 11 2 44 3] [ 4 22 5 55 6] [ 7 33 8 66 9]]
np.concatenate
- np.concatenate() 函数可以将多个数组沿着指定的轴连接在一起,实现数据的合并。
- 返回一个新的数组,原数组不会被修改。
code: import numpy as np # 一维数组拼接 arr_1d_1 = np.array([1, 2, 3]) arr_1d_2 = np.array([4, 5, 6]) new_arr_1d = np.concatenate((arr_1d_1, arr_1d_2)) # 一维数字组拼接不用指定axis print("一维数组拼接后的结果:", new_arr_1d) # 二维数组拼接 arr_2d_1 = np.array([[1, 2], [3, 4]]) arr_2d_2 = np.array([[5, 6], [7, 8]]) # 垂直拼接 new_arr_2d_vertical = np.concatenate((arr_2d_1, arr_2d_2), axis=0) # 垂直方向上拼接 print("\n二维数组垂直拼接后的结果:") print(new_arr_2d_vertical) # 水平拼接 new_arr_2d_horizontal = np.concatenate((arr_2d_1, arr_2d_2), axis=1) # 水平方向上拼接 print("\n二维数组水平拼接后的结果:") print(new_arr_2d_horizontal) result: 一维数组拼接后的结果: [1 2 3 4 5 6] 二维数组垂直拼接后的结果: [[1 2] [3 4] [5 6] [7 8]] 二维数组水平拼接后的结果: [[1 2 5 6] [3 4 7 8]]
np.hstack和np.vstack
- ☘️ np.hstack(tup1,tup2,…),注意参数的类型。
- ☘️ 参数tup是一个元组、列表或其他可迭代对象,其中包含了要进行水平拼接的多个数组。
- ☘️ np.vstack(tup1,tup2),和np.hstack不同的是拼接的方向不同。
code: import numpy as np nd1 = np.array([[1, 2], [3, 4], [5, 6]]) nd2 = np.array([[11, 22], [33, 44], [55, 66]]) print("hstack: ", np.hstack((nd1, nd2))) print("vstack: ", np.vstack((nd1, nd2))) result: hstack: [[ 1 2 11 22] [ 3 4 33 44] [ 5 6 55 66]] vstack: [[ 1 2] [ 3 4] [ 5 6] [11 22] [33 44] [55 66]]
ndarray数组元素的删除
np.delete()删除指定位置的元素
- NumPy 数组是固定大小的,直接删除元素通常会创建一个新数组。
- 删除一维数组元素,np.delete(arr1, idx),指定位置为idx。- 删除二维数组元素,np.delete(arr1, idx, axis=0/1),指定位置为idx,按行或者列要指定axis。code: import numpy as np arr1 = np.array(range(5)) arr2 = np.delete(arr1, [0,4]) arr3 = np.delete(arr1, 2) print(arr1) print(arr2) print(arr3) result: import numpy as np arr1 = np.array(range(5)) arr2 = np.delete(arr1, [0,4]) arr3 = np.delete(arr1, 2) print(arr1) print(arr2) print(arr3)
code: arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) arr2 = np.delete(arr1, 1, axis=0) # 删除第2行(索引1) arr3 = np.delete(arr1, [1,2], axis=0) # 删除第2行(索引1) print("arr1:\n",arr1) print("arr2:\n",arr2) print("arr3:\n",arr3) result: arr1: [[1 2 3] [4 5 6]js [7 8 9]] arr2: [[1 2 3] [7 8 9]] arr3: [[1 2 3]]
根据条件删除元素(过滤)
- 使用布尔索引创建符合条件的新数组
- 类似于(arr1>1) & (arr1<5)的表达式生成一个布尔数组。
code: import numpy as np arr1 = np.array([1, 2, 3, 4, 5, 6]) condition = (arr1>1) & (arr1<5) arr2 = arr1[condition] print("arr1\n", arr1) print(condition) print("arr2\n", arr2) result: arr1 [1 2 3 4 5 6] [False True True True False False] arr2 [2 3 4]
np.unique删除重复元素
删除重复元素,并重新排序
code: import numpy as np arr = np.array([1, 2, 2, 3, 3, 3, 5, 5, 4, 4]) unique_arr = np.unique(arr) print(type(unique_arr), unique_arr) result: <class 'numpy.ndarray'> [1 2 3 4 5]
修改ndarray中的元素
直接索引赋值
支持一维和多维
code: import numpy as np arr1 = np.array([10, 20, 30, 40]) arr1[2] = 300 arr1[-1] = 400 print("arr1:\n", arr1) arr2 = np.array([[1, 2], [3, 4]]) arr2[0, 1] = 20 print("arr2:\n", arr2) result: arr1: [ 10 20 300 400] arr2: [[ 1 20] [ 3 4]]
切片赋值
- 通过切片选择多个元素,批量修改值。
- 赋值时需要确保右侧值的形状与切片形状兼容。
code: import numpy as np arr1 = np.array([1, 2, 3, 4, 5]) arr1[1:4] = [20, 30, 40] print("arr1:\n", arr1) arr2 = np.array([1, 2, 3, 4, 5]) arr2[1:4] = 0 # 赋值为同一个数 print("arr2:\n", arr2) arr3 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) arr3[:, 2] = [20, 50, 80] # 修改第2列 print("arr3:\n", arr3) result: arr1: [ 1 20 30 40 5] arr2: [1 0 0 0 5] arr3: [[ 1 2 20] [ 4 5 50] [ 7 8 80]]
布尔索引赋值
通过布尔掩码选择符合条件的元素,批量修改。
code: import numpy as np arr1 = np.array([1, 2, 6, 4, 10, 5, 8]) arr1[(arr1 > 3) & (arr1 < 8) ] = 0 print("arr1:\n", arr1) result: arr1: [ 1 2 0 0 10 0 8]
使用 np.put() 按索引批量赋值
- np.put(arr, [索引],[对应索引的修改值])
code: import numpy as np arr = np.array([10, 20, 30, 40, 50]) np.put(arr, [0, 2, 4], [100, 300, 500]) # 修改索引0、2、4的元素 print(arr) result: [100 20 300 40 500]
使用 np.where() 条件替换
-☘️ np.where(condition),返回满足条件的元素的索引。
code: import numpy as np arr1 = np.array([1, 2, 3, 4, 5, 6]) indices = np.where(arr1 > 3) print("indices:\n", indices) print("arr1[indices]:\n", arr1[indices]) # np.where对于二维数组, 返回的是行索引和列索引列表, 满足条件的是2, 3,4这两个元素, 即为 # arr2[0,1], arr2[1,0], arr2[1,1],它们行索引形成[0,1,1], 列索引形成[1,0,1] arr2 = np.array([[1, 2], [3, 4]]) row_idx, col_idx = np.where(arr2 > 1) print(f"row_idx:{row_idx}, col_idx: {col_idx}") result: indices: (array([3, 4, 5], dtype=int64),) arr1[indices]: [4 5 6] row_idx:[0 1 1], col_idx: [1 0 1]
- -☘️ np.where(condition, x, y),当 condition 为 True 时,取 x 的值,否则取y的值。
- -☘️ 算是3目运算符。
code: import numpy as np dt = np.dtype([ ('name', 'U3'), # Unicode字符串,最大长度3 ('age', np.int32), ('height', float) ]) arr = np.array([ ('Alice', 25, 1.65), ('Bob', 30, 1.80), ('Charlie', 22, 1.75) ], dtype=dt) print(arr) print(arr[0]["name"]) print(arr["age"]) result: [('Ali', 25, 1.65) ('Bob', 30, 1.8 ) ('Cha', 22, 1.75)] Ali [25 30 22]
修改为特殊http://www.devze.com值
- ️ 如果要赋值为nan,必须dtarray为float型,先要进行数据类型的转换。
numpy中的裁剪函数Clip
- Clip函数用于将数组中的元素限制在指定的最小值和最大值之间。
- np.clip(arr, a_min, a_max, out=None), arr:输入的数组。a_min:最小值(低于此值的元素将被替换为 a_min, a_max:最大值(高于此值的元素将被替换为 a_max)。
- out(可选):指定输出结果的数组,如果指定为arr,相当于原地修改,若不提供则返回新数组。
code: import numpy as np arr2d = np.array([[1, 5], [10, 15]]) clipped = np.clip(arr2d, 3, 12, out=arr2d) print(clipped) print(arr2d) result: [[ 3 5] [10 12]] [[ 3 5] [10 12]]
到此这篇关于python numpy数组元素的访问及数组的增删改查的文章就介绍到这了,更多相关Python numpy数组元素增删改查内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论