Python中如何用Fancy Indexing为NumPy数组行填充指定长度的1?
解决NumPy按行指定长度填充元素的问题
你遇到的错误是因为切片的右端无法直接传入数组类型的limits,NumPy不支持这种索引方式。以下是两种无需循环的高效解决方案:
方法一:广播生成布尔掩码(推荐)
通过列索引数组与limits广播比较,生成布尔掩码后批量赋值:
import numpy as np a = np.zeros((3,20)) limits = np.array([5, 10, 15]) # 生成0到19的列索引,形状为(1,20) col_indices = np.arange(20) # 将limits转为(3,1)形状,与col_indices广播得到(3,20)的布尔矩阵 mask = col_indices < limits[:, np.newaxis] # 利用掩码为对应位置赋值 a[mask] = 1
limits[:, np.newaxis]将一维的limits转换为列向量,触发广播机制后,每个行的limit值会和所有列索引比较,最终得到的掩码矩阵精准标记出每行需要设为1的位置。
方法二:使用np.put_along批量赋值
构造每行的有效列索引,通过np.put_along沿轴赋值:
import numpy as np a = np.zeros((3,20)) limits = np.array([5, 10, 15]) # 生成行索引的列向量,形状(3,1) row_indices = np.arange(3)[:, np.newaxis] # 生成列索引数组,形状(1,20) col_indices = np.arange(20) # 筛选出每行limit以内的列索引 valid_mask = col_indices < limits[:, np.newaxis] # 仅对有效位置赋值1 np.put_along(a, col_indices * valid_mask, 1, axis=1)
内容的提问来源于stack exchange,提问作者Tamme
相关产品推荐
相关产品推荐

