Numpy 第六章 排序,搜索和计数

张开发
2026/4/21 21:12:04 15 分钟阅读

分享文章

Numpy 第六章 排序,搜索和计数
一.排序1.numpy.sort()函数参数说明a: 要排序的数组。axis: 排序沿数组的轴方向。0: 按列排序。1: 按行排序。None: 展开成一维数组后排序。-1(默认): 沿最后一个轴排序。kind: 排序算法可选quicksort快排默认、mergesort混排、heapsort堆排。order: 对于结构化数组指定按哪个字段排序。例二维数组的排序对一个 5x5 的随机浮点数数组进行不同方式的排序。import numpy as np np.random.seed(20200612) x np.random.rand(5, 5) * 10 x np.around(x, 2) print(x) # 输出原始数组 # [[2.32 7.54 9.78 1.73 6.22] # [6.93 5.17 9.28 9.76 8.25] # [0.01 4.23 0.19 1.73 9.27] # [7.99 4.97 0.88 7.32 4.29] # [9.05 0.07 8.95 7.9 6.99]] # 默认按行排序 (axis-1) y np.sort(x) print(y) # 每行内的元素从小到大排序 # [[1.73 2.32 6.22 7.54 9.78] # [5.17 6.93 8.25 9.28 9.76] # [0.01 0.19 1.73 4.23 9.27] # [0.88 4.29 4.97 7.32 7.99] # [0.07 6.99 7.9 8.95 9.05]] # 按列排序 (axis0) y np.sort(x, axis0) print(y) # 每列内的元素从小到大排序 # [[0.01 0.07 0.19 1.73 4.29] # [2.32 4.23 0.88 1.73 6.22] # [6.93 4.97 8.95 7.32 6.99] # [7.99 5.17 9.28 7.9 8.25] # [9.05 7.54 9.78 9.76 9.27]] # 按行排序 (axis1)效果与默认相同 y np.sort(x, axis1) print(y) # 每行内的元素从小到大排序 # [[1.73 2.32 6.22 7.54 9.78] # [5.17 6.93 8.25 9.28 9.76] # [0.01 0.19 1.73 4.23 9.27] # [0.88 4.29 4.97 7.32 7.99] # [0.07 6.99 7.9 8.95 9.05]]例结构化数组的排序对包含多个字段的结构化数组按指定字段排序。import numpy as np # 定义一个结构化数据类型 dt np.dtype([(name, S10), (age, np.int)]) # 创建一个结构化数组 a np.array([(Mike, 21), (Nancy, 25), (Bob, 17), (Jane, 27)], dtypedt) # 按 name 字段排序 b np.sort(a, ordername) print(b) # 按名字的字母顺序排序 # [(bBob, 17) (bJane, 27) (bMike, 21) (bNancy, 25)] # 按 age 字段排序 b np.sort(a, orderage) print(b) # 按年龄从小到大排序 # [(bBob, 17) (bMike, 21) (bNancy, 25) (bJane, 27)]2.numpy.argsort()函数numpy.argsort(a[, axis-1, kindquicksort, orderNone])作用返回将数组排序后元素所在的索引而不是排序后的数组本身。返回值一个索引数组该数组可以用于从原数组中“取出”排序后的结果。默认沿最后一个轴axis-1进行升序排序使用快速排序算法kindquicksort。例一维数组import numpy as np np.random.seed(20200612) x np.random.randint(0, 10, 10) # 生成 [6 1 8 5 5 4 1 2 9 1] y np.argsort(x) # 获取排序索引[1 6 9 7 5 3 4 0 2 8] print(x[y]) # 用索引重构排序后的数组[1 1 1 2 4 5 5 6 8 9]y是x排序后的索引序列。x[y]就是真正的升序排序结果。如果想降序可以传入-xy np.argsort(-x) # 降序索引 print(x[y]) # [9 8 6 5 5 4 2 1 1 1]例二维数组x np.random.rand(5, 5) * 10 x np.around(x, 2) # 保留两位小数[[2.32 7.54 9.78 1.73 6.22] [6.93 5.17 9.28 9.76 8.25] ... ]例 默认沿最后轴axis-1排序 → 每行独立排序y np.argsort(x) # 每行内部的索引排序 print(y) # 输出每行的升序索引比如第一行 [3 0 4 1 2] 表示 x[0][3]1.73 最小x[0][0]2.32 第二小...例沿列排序axis0→ 每列内部排序y np.argsort(x, axis0) # 每列内部的索引排序 print(y) # 输出每列的升序索引比如第一列 [2 4 2 0 3] 表示第2行最小值第4行第二小...例:重构排序后的数组y np.array([np.take(x[i], np.argsort(x[i])) for i in range(5)]) print(y) # 对每一行分别排序后重建数组 # [[1.73 2.32 6.22 7.54 9.78] # [5.17 6.93 8.25 9.28 9.76] # ... ]np.take(a, indices)函数沿指定轴从数组a中提取indices指定的元素。这里对每一行x[i]用argsort得到索引再用take提取排序后的元素最后组成新数组。3.numpy.lexsort()函数numpy.lexsort(keys[, axis-1])功能使用一系列键keys执行间接稳定排序。返回值返回一个整数索引数组该索引数组描述了按多个键排序后的顺序。排序规则最后一个键是主排序键优先级最高。倒数第二个键是辅助排序键依此类推。如果keys是二维数组则将其行解释为排序键按最后一行、倒数第二行等排序。参数要求keys必须是可转换为相同形状数组的对象序列。例按第一列升序/降序排序整个矩阵import numpy as np np.random.seed(20200612) x np.random.rand(5, 5) * 10 x np.around(x, 2) print(x) # 输出原始矩阵升序排序默认index np.lexsort([x[:, 0]]) y x[index] print(y) # 按第一列从小到大排序降序排序index np.lexsort([-1 * x[:, 0]]) # 乘以 -1 实现降序 y x[index] print(y) # 按第一列从大到小排序lexsort接收的是“键序列”默认是升序。要降序只需对键取负因为升序排序负数相当于原数的降序。例按多个键排序先按 y再按 xx np.array([1, 5, 1, 4, 3, 4, 4]) y np.array([9, 4, 0, 4, 0, 2, 1]) # 只按 x 排序 a np.lexsort([x]) print(a) # 索引[0 2 4 3 5 6 1] print(x[a]) # 结果[1 1 3 4 4 4 5] # 只按 y 排序 b np.lexsort([y]) print(b) # 索引[2 4 6 5 1 3 0] print(y[b]) # 结果[0 0 1 2 4 4 9] # 先按 y 排序再按 x 排序注意y 是最后一个键优先级更高 z np.lexsort([y, x]) print(z) # 索引[2 0 4 6 5 3 1] print(x[z]) # 结果[1 1 3 4 4 4 5] # 先按 x 排序再按 y 排序x 是最后一个键优先级更高 z np.lexsort([x, y]) print(z) # 索引[2 4 6 5 3 1 0] print(y[z]) # 结果[0 0 1 2 4 4 9]关键点np.lexsort([key1, key2])中key1 是次要键key2 是主键。所以np.lexsort([y, x])表示先按 x 排序x 相同再按 y 排序。如果你想“先按 y 再按 x”应该写成np.lexsort([x, y])—— 因为 y 是第一个参数是次要键x 是第二个参数是主键。越靠后的键优先级越高注意容易搞反顺序记住列表中的第一个元素是次要键最后一个是主键。4.numpy.partition()函数函数原型numpy.partition(a, kth, axis-1, kindintroselect, orderNone)功能返回一个数组的分区副本。它会将数组a的元素重新排列使得第kth个位置上的元素处于它在排序数组中应有的位置。分区规则所有小于第kth个元素的元素都会被移动到它前面。所有等于或大于第kth个元素的元素都会被移动到它后面。注意两个分区即“小于”部分和“大于或等于”部分内部的元素顺序是不确定的undefined。类比有点类似于快速排序QuickSort中的分区步骤。例基本用法按列分区import numpy as np np.random.seed(100) x np.random.randint(1, 30, [8, 3]) print(x) # 输出原始数组 x z np.partition(x, kth2, axis0) print(z)分析首先生成一个 8 行 3 列的随机整数数组x。np.partition(x, kth2, axis0)表示沿着axis0即按列进行分区。kth2意味着将每一列中第 3 小的元素索引为 2因为索引从 0 开始放到该列的正确位置上。结果z中每一列的第 3 个元素是该列排序后的第 3 小元素它前面的元素都小于它后面的元素都大于或等于它。但每一列内其他元素的相对顺序是不确定的。例选取每一列第三小的数z np.partition(x, kth2, axis0) print(z[2])分析在上一例的基础上z[2]就是按列分区后得到的数组中第 3 行索引为 2。由于每一列的第 3 个元素索引 2已经被放到了它在排序数组中的位置所以z[2]实际上就是每一列中第 3 小的元素组成的数组。例选取每一列第三大的数据z np.partition(x, kth-3, axis0) print(z[-3])分析kth-3表示选取第 3 大的元素负数索引从末尾开始计数-1 是最后一个-2 是倒数第二个-3 是倒数第三个。z[-3]就是按列分区后得到的数组中倒数第 3 行。这一行的元素是每一列中第 3 大的元素。注kth参数指定了分区点。axis参数指定了沿着哪个轴进行分区。分区后分区点两侧的元素顺序是未定义的。5.numpy.argpartition()函数函数原型numpy.argpartition(a, kth, axis-1, kindintroselect, orderNone)功能沿给定轴执行间接分区。它返回一个与数组a形状相同的索引数组这些索引表示沿给定轴按分区顺序排列的数据。核心作用它不是返回分区后的数组元素而是返回这些元素在原数组中的索引。分区规则与numpy.partition()类似它会确保第kth个位置上的元素在索引数组中对应的原数组元素处于其在排序数组中的位置。所有小于该元素的索引会被放在它前面所有大于或等于该元素的索引会被放在它后面。同样两个分区内部的索引顺序是不确定的。kth可以是正数从前往后数或负数从后往前数例如kth2表示第 3 小的元素kth-3表示第 3 大的元素。例基本用法按列分区并返回索引import numpy as np np.random.seed(100) x np.random.randint(1, 30, [8, 3]) print(x) # 输出原始数组 x z np.argpartition(x, kth2, axis0) print(z)分析首先生成一个 8 行 3 列的随机整数数组x。np.argpartition(x, kth2, axis0)表示沿着axis0即按列进行分区并返回索引。kth2意味着将每一列中第 3 小的元素索引为 2的索引放到该列的正确位置上。结果z是一个索引数组其中z[i, j]表示原数组x中第i行第j列的元素在分区后应该位于的位置的索引。例如z[2]表示在按列分区后每一列的第 3 个元素索引为 2在原数组中的行索引。例选取每一列第三小的数的索引z np.argpartition(x, kth2, axis0) print(z[2])分析z[2]输出的是按列分区后每一列第 3 小的元素在原数组中的行索引。例如如果输出是[1 4 0]这意味着第 0 列第 3 小的元素位于原数组的第 1 行。第 1 列第 3 小的元素位于原数组的第 4 行。第 2 列第 3 小的元素位于原数组的第 0 行。例选取每一列第三大的数的索引z np.argpartition(x, kth-3, axis0) print(z[-3])分析kth-3表示从后往前数第 3 个位置即第 3 大的元素。z[-3]输出的是按列分区后每一列第 3 大的元素在原数组中的行索引。例如如果输出是[2 1 7]这意味着第 0 列第 3 大的元素位于原数组的第 2 行。第 1 列第 3 大的元素位于原数组的第 1 行。第 2 列第 3 大的元素位于原数组的第 7 行。与numpy.partition()的对比函数返回值用途numpy.partition(a, kth)分区后的数组元素直接获取分区后的数据numpy.argpartition(a, kth)分区后的数组元素的索引获取分区后数据在原数组中的位置二.搜索1.numpy.argmax()函数功能返回数组中最大值的索引。可以指定沿哪个轴axis查找。函数numpy.argmax(a[, axisNone, outNone])a: 输入数组。axis: 沿着哪个轴查找。默认为None表示将数组展平为一维后找全局最大值索引。out: 可选用于存储结果的数组。import numpy as np np.random.seed(20200612) x np.random.rand(5, 5) * 10 x np.around(x, 2) print(x) # 这是一个 5×5 的二维数组。 # [[2.32 7.54 9.78 1.73 6.22] [6.93 5.17 9.28 9.76 8.25] [0.01 4.23 0.19 1.73 9.27] [7.99 4.97 0.88 7.32 4.29] [9.05 0.07 8.95 7.9 6.99]]例y np.argmax(x)—— 全局最大值索引默认axisNone将整个数组展平成一维。数组展平后为[2.32, 7.54, 9.78, 1.73, 6.22, 6.93, 5.17, 9.28, 9.76, 8.25, 0.01, 4.23, 0.19, 1.73, 9.27, 7.99, 4.97, 0.88, 7.32, 4.29, 9.05, 0.07, 8.95, 7.9, 6.99]最大值是9.78它在展平后的索引是2。所以print(y)输出2。例y np.argmax(x, axis0)—— 按列找最大值索引axis0表示沿列方向即在每一列中找最大值的行索引。第0列[2.32, 6.93, 0.01, 7.99, 9.05]→ 最大值在索引4第1列[7.54, 5.17, 4.23, 4.97, 0.07]→ 最大值在索引0第2列[9.78, 9.28, 0.19, 0.88, 8.95]→ 最大值在索引0第3列[1.73, 9.76, 1.73, 7.32, 7.9]→ 最大值在索引1第4列[6.22, 8.25, 9.27, 4.29, 6.99]→ 最大值在索引2所以结果是[4, 0, 0, 1, 2]例y np.argmax(x, axis1)—— 按行找最大值索引axis1表示沿行方向即在每一行中找最大值的列索引。第0行[2.32, 7.54, 9.78, 1.73, 6.22]→ 最大值在索引2第1行[6.93, 5.17, 9.28, 9.76, 8.25]→ 最大值在索引3第2行[0.01, 4.23, 0.19, 1.73, 9.27]→ 最大值在索引4第3行[7.99, 4.97, 0.88, 7.32, 4.29]→ 最大值在索引0第4行[9.05, 0.07, 8.95, 7.9, 6.99]→ 最大值在索引0所以结果应为[2, 3, 4, 0, 0]虽然图中没打印但可以推断2.numpy.argmin()函数功能返回数组中最小值的索引。同样可以指定沿哪个轴查找。函数numpy.argmin(a[, axisNone, outNone])同样使用上面的数组x。例y np.argmin(x)—— 全局最小值索引全局最小值是0.01它在展平后的索引是10。所以print(y)输出10。例y np.argmin(x, axis0)—— 按列找最小值索引第0列[2.32, 6.93, 0.01, 7.99, 9.05]→ 最小值在索引2第1列[7.54, 5.17, 4.23, 4.97, 0.07]→ 最小值在索引4第2列[9.78, 9.28, 0.19, 0.88, 8.95]→ 最小值在索引2第3列[1.73, 9.76, 1.73, 7.32, 7.9]→ 最小值在索引0第4列[6.22, 8.25, 9.27, 4.29, 6.99]→ 最小值在索引3所以结果是[2, 4, 2, 0, 3]例y np.argmin(x, axis1)—— 按行找最小值索引第0行[2.32, 7.54, 9.78, 1.73, 6.22]→ 最小值在索引31.73第1行[6.93, 5.17, 9.28, 9.76, 8.25]→ 最小值在索引15.17第2行[0.01, 4.23, 0.19, 1.73, 9.27]→ 最小值在索引00.01第3行[7.99, 4.97, 0.88, 7.32, 4.29]→ 最小值在索引20.88第4行[9.05, 0.07, 8.95, 7.9, 6.99]→ 最小值在索引10.07所以结果是[3, 1, 0, 2, 1]3.numpy.nonzero()函数作用返回数组中非零元素的索引下标。返回值一个长度为数组维度ndim的元组元组的每个元素是一个整数数组分别表示每个维度上非零元素的索引。特性只有非零元素才有索引零元素无索引。对于二维数组元组的第一个数组是行索引第二个是列索引。np.transpose(np.nonzero(x))可将索引转换为每行一个坐标的形式更直观。x[np.nonzero(x)]可直接提取所有非零元素。例一维数组示例import numpy as np x np.array([0, 2, 3]) y np.nonzero(x) print(y) # (array([1, 2], dtypeint64),)x是形状为(3,)的一维数组。np.nonzero(x)返回一个元组其中包含一个数组[1, 2]表示非零元素2和3的索引。例二维数组示例x np.array([[3, 0, 0], [0, 4, 0], [5, 6, 0]]) y np.nonzero(x) print(y) # (array([0, 1, 2, 2]), array([0, 1, 0, 1]))x是 3×3 的二维数组。返回元组中第一个数组[0, 1, 2, 2]是行索引非零元素所在的行。第二个数组[0, 1, 0, 1]是列索引非零元素所在的列。组合起来非零元素的位置是(0,0)3,(1,1)4,(2,0)5,(2,1)6。例三维数组示例x np.array([[[0,1],[1,0]], [[0,1],[1,0]], [[0,0],[1,0]]]) y np.nonzero(x) print(np.array(y)) # [[0 0 1 1 2] # [0 1 0 1 1] # [1 0 1 0 0]]x是 3×2×2 的三维数组。返回元组有3个数组分别对应三维的三个维度深度、行、列的索引。x[np.nonzero(x)]会提取所有非零元素[1, 1, 1, 1, 1]。例布尔数组应用x np.array([[1,2,3],[4,5,6],[7,8,9]]) y x 3 # 生成布尔数组 print(np.nonzero(y)) # (array([1, 1, 1, 2, 2, 2]), array([0, 1, 2, 0, 1, 2]))x 3生成一个布尔数组值为True的位置对应x中大于3的元素。np.nonzero(y)返回这些True位置的索引等价于x 0因为布尔值True1,False0。x[np.nonzero(x 3)]或x[x 3]均可提取所有大于3的元素[4,5,6,7,8,9]。注numpy.nonzero(a)的核心是定位非零元素的位置返回每个维度的索引数组。结合transpose可让索引更直观每行一个坐标。结合布尔运算如x 3可实现条件筛选等价于x[x 3]。4.numpy.where()函数函数numpy.where(condition, [xNone, yNone])作用根据condition条件选择元素。如果condition为 True从x中取元素如果condition为 False从y中取元素。返回值一个数组元素来自x或y取决于condition。如果只传入condition不传x和y则等价于numpy.nonzero(condition)返回满足条件非0元素的坐标索引以 tuple 形式。例带 x 和 y 的用法条件选择import numpy as np x np.arange(10) print(x) # [0 1 2 3 4 5 6 7 8 9] y np.where(x 5, x, 10 * x) print(y) # [ 0 1 2 3 4 50 60 70 80 90]分析x 5生成布尔数组[True, True, True, True, True, False, False, False, False, False]对于前5个元素5取x本身 →0,1,2,3,4对于后5个元素≥5取10*x→50,60,70,80,90例多维数组x np.array([[0, 1, 2], [0, 2, 4], [0, 3, 6]]) y np.where(x 4, x, -1) print(y) # [[ 0 1 2] # [ 0 2 -1] # [ 0 3 -1]]分析条件x 4逐元素判断第0行0,1,2都 4 → 保留原值第1行0,244≥4 → 替换为 -1第2行0,346≥4 → 替换为 -1例只传 condition获取索引一维数组x np.arange(10) y np.where(x 5) print(y) # (array([5, 6, 7]),) —— 注意这是元组包含一个数组 print(x[y]) # [6 7 8] —— 用索引取出对应元素多维数组二维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.where(x 25) print(y) # (array([3, 3, 3, 3, 3, 4, 4, 4, 4, 4]), array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4])) print(x[y]) # [26 27 28 29 30 31 32 33 34 35]分析x 25是一个 5x5 的布尔矩阵满足条件的是最后两行索引3和4。np.where(x 25)返回一个 tuple包含两个数组第一个数组行索引 →[3,3,3,3,3,4,4,4,4,4]第二个数组列索引 →[0,1,2,3,4,0,1,2,3,4]用x[y]可以用这些坐标取出对应元素 → 最后两行所有元素等价操作np.where(condition)≈np.nonzero(condition)y1 np.where(x 5) y2 np.nonzero(x 5) print(y1 y2) # True结构和内容相同用法语法作用返回值条件选择np.where(cond, x, y)满足条件取 x否则取 y新数组获取索引np.where(cond)返回满足条件元素的索引坐标tuple of arrays5.numpy.searchsorted()函数函数:numpy.searchsorted(a, v[, sideleft, sorterNone])功能在已排序的一维数组a中找到一组值v应该插入的位置索引以保持数组有序。返回值插入位置的索引整数或整数数组不直接修改原数组。参数说明a一维输入数组。若sorterNone则a必须是升序排列。若sorter不为None则sorter是一个索引数组用于描述a的升序排列方式即a[sorter]是升序的。v要插入的值可以是单个元素、列表或 NumPy 数组。side查询方向可选left或right。left返回第一个满足条件的索引左侧插入点。right返回最后一个满足条件的索引右侧插入点。sorter一维数组存放a中元素的索引使得a[sorter]是升序的。例基础用法数组已排序import numpy as np x np.array([0, 1, 5, 9, 11, 18, 26, 33]) y np.searchsorted(x, 15) # 默认 sideleft → 5 y np.searchsorted(x, 15, sideright) # → 5因为15不在数组中左右相同 y np.searchsorted(x, -1) # → 0 y np.searchsorted(x, -1, sideright) # → 0 y np.searchsorted(x, 35) # → 8超出末尾插入到末尾后 y np.searchsorted(x, 35, sideright) # → 8 y np.searchsorted(x, 11) # → 4等于11的第一个位置 y np.searchsorted(x, 11, sideright) # → 5等于11的最后一个位置之后 y np.searchsorted(x, 0) # → 0 y np.searchsorted(x, 0, sideright) # → 10的右边插入点 y np.searchsorted(x, 33) # → 7最后一个元素位置 y np.searchsorted(x, 33, sideright) # → 8插入到33之后例批量查询v 为数组y np.searchsorted(x, [-1, 0, 11, 15, 33, 35]) print(y) # [0 0 4 5 7 8] y np.searchsorted(x, [-1, 0, 11, 15, 33, 35], sideright) print(y) # [0 1 5 5 8 8]→ 返回一个与v长度相同的数组对应每个值的插入位置。例处理未排序数组使用 sorterx np.array([0, 1, 5, 9, 11, 18, 26, 33]) np.random.shuffle(x) # 打乱顺序比如变成 [33, 1, 9, 18, 11, 26, 0, 5] x_sort np.argsort(x) # 获取排序索引[6, 1, 7, 2, 4, 3, 5, 0] # 即 x[x_sort] [0, 1, 5, 9, 11, 18, 26, 33]升序 y np.searchsorted(x, [-1, 0, 11, 15, 33, 35], sorterx_sort) print(y) # [0 0 4 5 7 8] —— 正确识别插入位置 y np.searchsorted(x, [-1, 0, 11, 15, 33, 35], sideright, sorterx_sort) print(y) # [0 1 5 5 8 8]→ 即使原数组x未排序只要提供正确的sorter即np.argsort(x)函数仍能正确工作。注必须确保a是有序的或通过sorter提供排序映射。side参数决定插入点找“大于等于”的边界用left常用于二分查找左边界。找“大于”的边界用right常用于二分查找右边界。批量查询效率高一次传入多个值返回数组适合向量化操作。未排序数组先用np.argsort(x)获取sorter再传入searchsorted。三.计数numpy.count_nonzero()函数函数numpy.count_nonzero(a, axisNone)功能统计数组a中非零元素的个数。返回值一个整数如果axisNone或一个数组如果指定了axis表示沿指定轴统计的非零元素个数。参数说明a输入数组可以是任意维度的 NumPy 数组或类似列表的结构。axis指定统计的轴维度。axisNone默认统计整个数组中的非零元素总数。axis0沿列方向统计每列的非零元素个数。axis1沿行方向统计每行的非零元素个数。其他整数值指定具体的轴如axis2用于三维数组。例统计整个数组的非零元素个数import numpy as np # 示例 1单位矩阵4x4对角线为1其余为0 x np.count_nonzero(np.eye(4)) print(x) # 输出: 4因为单位矩阵有4个1 # 示例 2二维列表 x np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]]) print(x) # 输出: 5非零元素1, 7, 3, 2, 19例沿指定轴统计非零元素个数# 示例 1沿列方向统计axis0 x np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis0) print(x) # 输出: [1 1 1 1 1] # 解释 # 第0列0, 3 → 1个非零 # 第1列1, 0 → 1个非零 # 第2列7, 0 → 1个非零 # 第3列0, 2 → 1个非零 # 第4列0, 19 → 1个非零 # 示例 2沿行方向统计axis1 x np.count_nonzero([[0, 1, 7, 0, 0], [3, 0, 0, 2, 19]], axis1) print(x) # 输出: [2 3] # 解释 # 第0行0, 1, 7, 0, 0 → 2个非零1, 7 # 第1行3, 0, 0, 2, 19 → 3个非零3, 2, 19例统计布尔数组中的True个数由于True被视为1False被视为0因此np.count_nonzero()也可以用于统计布尔数组中True的个数。arr np.array([True, False, True, True]) count np.count_nonzero(arr) print(count) # 输出: 3例结合条件筛选可以先用布尔索引筛选出满足条件的元素再统计非零个数。arr np.array([1, 2, 3, 4, 5]) # 统计大于3的元素个数 count np.count_nonzero(arr 3) print(count) # 输出: 2元素4和5注如果数组中的元素是0或False它们会被视为零不计入统计。如果数组是多维的指定axis可以控制统计的方向。该函数对整数、浮点数、布尔值等类型都有效。

更多文章