如何查找数组全零行与全零列的交点并设为1,无交点则跳过?
NumPy数组全零行列交点置1解决方案
需求说明
在NumPy数组中查找所有全零行和全零列,将它们的交点位置的值设为1;若不存在这样的交点,则跳过此操作。
输入数组
import numpy as np uvv = np.array([[0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0], [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0], [0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0], [0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1], [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0], [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]])
已有尝试代码
你已经正确完成了全零行和全零列的识别:
# 标记全零行和全零列 m1 = ~uvv.any(axis=1) # 全零行标记(布尔数组) m2 = ~uvv.any(axis=0) # 全零列标记(布尔数组) # 获取全零行和全零列的索引 rows = np.nonzero(m1)[0] # 全零行索引列表 cols = np.nonzero(m2)[0] # 全零列索引列表
完整实现代码
在已有代码基础上,补充交点置1的逻辑,提供两种实现方式:
方式1:循环遍历(直观易读)
# 检查是否存在全零行和全零列 if len(rows) > 0 and len(cols) > 0: # 遍历所有交点并置1 for row in rows: for col in cols: uvv[row, col] = 1
方式2:NumPy广播(高效简洁)
利用NumPy广播机制避免循环,大数组场景下性能更优:
# 检查是否存在全零行和全零列 if len(rows) > 0 and len(cols) > 0: # 广播索引,一次性设置所有交点为1 uvv[rows[:, None], cols] = 1
结果验证
执行代码后,原数组中的第12行(索引11)是全零行,全零列是索引10,因此uvv[11, 10]会被设置为1,该行变为:[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
内容的提问来源于stack exchange,提问作者Maluma Corazón
相关产品推荐
相关产品推荐

