无法将拼接后的numpy float64数组转换为float32的技术求助
解决拼接数组转float32失败的问题
我之前碰到过类似的场景,单独用hist转float32没问题,但拼接后就报错,大概率是下面这几个原因导致的,你可以一步步排查:
1. 拼接后的数组藏着NaN/无穷大值
当计算n_zero_rows的时候,如果n_zero.sum(1)全是0,加上eps后再做归一化,很可能会出现除以0的情况,得到Inf;或者eps设置得不合理,导致数值计算出现NaN。这些非有限值在转float32时可能触发异常(或者结果不符合预期)。
排查和修复:
先在代码里加个检查,看看拼接后的特征有没有问题:
features = np.concatenate((hist, n_zero_rows), axis=0) # 打印非有限值的数量 print(f"NaN数量: {np.isnan(features).sum()}") print(f"无穷大值数量: {np.isinf(features).sum()}")
如果发现有这类值,修改n_zero_rows的计算逻辑,避免除以0:
row_sum = n_zero.sum(1) row_sum_plus_eps = row_sum + eps # 给全0的情况设置一个极小值,防止除以0 row_sum_plus_eps[row_sum_plus_eps == 0] = 1e-8 n_zero_rows = row_sum / np.linalg.norm(row_sum_plus_eps)
2. 拼接的两个数组维度不匹配
虽然np.concatenate没报错,但可能hist和n_zero_rows的维度不一致,导致拼接后的数组结构混乱,后续转类型时出问题。比如hist是二维数组(比如形状(1, 64)),而n_zero_rows是一维数组(比如形状(28,)),按axis=0拼接后会得到奇怪的形状,转类型时就会出错。
排查和修复:
先打印两个数组的形状看看:
print(f"hist形状: {hist.shape}") print(f"n_zero_rows形状: {n_zero_rows.shape}")
如果维度不匹配,就把它们统一成相同维度再拼接:
# 比如把一维的n_zero_rows转成二维,和hist的维度对齐 n_zero_rows = n_zero_rows.reshape(1, -1) # 然后按axis=1拼接(如果hist是(1, D)的话) features = np.concatenate((hist, n_zero_rows), axis=1)
3. 换个转换顺序:先转单个数组再拼接
有时候先把hist和n_zero_rows都转成float32,再拼接,比先拼接再转类型更稳妥,能避免中间过程的隐式类型转换问题。
修改后的代码示例:
def someFunction(hist, imgs): samples = [] eps = 1e-8 # 假设你定义了eps,这里补上 # 先把hist转成float32 hist_float32 = np.float32(hist) for img in imgs: n_zero = img != 0 n_zero_cols = n_zero.sum(0) / np.linalg.norm(n_zero.sum(0) + eps) row_sum = n_zero.sum(1) row_sum_plus_eps = row_sum + eps row_sum_plus_eps[row_sum_plus_eps == 0] = 1e-8 n_zero_rows = row_sum / np.linalg.norm(row_sum_plus_eps) # 把n_zero_rows也转成float32 n_zero_rows_float32 = np.float32(n_zero_rows) # 拼接两个float32数组 features = np.concatenate((hist_float32, n_zero_rows_float32), axis=0) samples.append(features) # 最后转成float32数组 return np.array(samples, dtype=np.float32)
4. 极端情况:内存不足
如果拼接后的数组特别大,转float32时可能出现内存溢出。你可以打印数组的字节大小看看:
features = np.concatenate((hist, n_zero_rows), axis=0) print(f"特征数组字节大小: {features.nbytes / 1024 / 1024} MB")
如果确实太大,可以考虑优化特征维度,或者分批处理。
内容的提问来源于stack exchange,提问作者Jibreel
相关产品推荐
相关产品推荐

