numpy.delete删除随机采样数组元素后长度异常问题
问题原因
核心bug出在np.random.choice的默认采样逻辑:
- 该函数默认使用有放回采样,你没有显式指定
replace=False,因此生成的索引数组ints1存在大量重复值 - 当向
np.delete传入包含重复值的索引数组时,同一个行位置只会被删除一次,不会因为索引重复出现就多次删除同一行,最终实际删除的行数远小于你预期的10% - 数值校验:预期删除150298行,实际删除行数为1502983 - 1359941 = 143042行,差值7256就是重复索引导致的少删行数
- 额外隐患:你对两个数组复用了同一组采样索引
ints1,如果x_2g长度和x_1g不一致,会直接触发索引越界报错。
修复代码
采样时显式开启无放回模式,两个数组分别生成独立的采样索引,删除后交叉拼接即可保证形状和原数组完全一致:
import numpy as np # 处理第一个数组的10%采样 n1 = x_1g.shape[0] sample_num1 = round(n1 * 0.1) # 无放回采样保证索引唯一,无重复 swap_idx1 = np.random.choice(n1, sample_num1, replace=False) x1_swap_part = x_1g[swap_idx1, :] x1_remain = np.delete(x_1g, swap_idx1, axis=0) # 处理第二个数组的10%采样 n2 = x_2g.shape[0] sample_num2 = round(n2 * 0.1) swap_idx2 = np.random.choice(n2, sample_num2, replace=False) x2_swap_part = x_2g[swap_idx2, :] x2_remain = np.delete(x_2g, swap_idx2, axis=0) # 交叉拼接得到最终数组,形状与原数组完全一致 x_1g_new = np.vstack([x1_remain, x2_swap_part]) x_2g_new = np.vstack([x2_remain, x1_swap_part])
校验提示:执行完成后打印形状,
x_1g_new.shape与原x_1g.shape完全相等,x_2g_new.shape与原x_2g.shape完全相等,两个数组各包含10%来自对方的样本数据。
内容的提问来源于stack exchange,提问作者Lara
相关产品推荐
相关产品推荐

