Matplotlib绘制SHA-256哈希整数直方图时出现TypeError问题求助
Matplotlib绘制SHA-256哈希整数直方图时出现TypeError问题求助
看起来你已经完成了作业的核心部分,就差最后一步的直方图绘制啦!这个错误其实很好解决,我来帮你拆解分析:
错误根源
你遇到的TypeError: ufunc 'isfinite' not supported for the input types,本质原因是SHA-256转换后的整数是256位的超大Python任意精度整数(数值范围在0到2^256-1之间)。Matplotlib的hist函数依赖numpy处理数据,而numpy无法直接识别这种超大的Python原生整数,导致用于校验数值有效性的isfinite函数无法处理该类型,最终抛出类型错误。
两种快速修复方案
方案1:将超大整数归一化到[0,1)区间(推荐)
把256位大整数除以2^256,转换成0到1之间的浮点数,这样numpy能完美处理,同时直方图的x轴会更直观(原始数值范围过大,直接展示没有实际参考意义)。
修改你的plot_histogram函数如下:
def plot_histogram(results, bins = 20): # 直接提取所有SHA-256对应的整数(无需重复转换或校验) integer_values = [val for _, _, val in results] # 归一化到0-1区间,解决超大整数的类型兼容问题 normalized_values = [val / (2 ** 256) for val in integer_values] plt.figure(figsize=(10, 6)) plt.hist(normalized_values, bins=bins, color='purple', edgecolor='black') plt.title(f'SHA-256整数归一化直方图({bins}个区间)') plt.xlabel('归一化后数值(0到1)') plt.ylabel('频数') plt.grid(axis='y', linestyle='--', linewidth=0.7, alpha=0.7) # 加个小注释帮助理解归一化的作用 plt.figtext(0.5, 0.01, '注:将256位大整数除以2^256实现归一化,解决numpy无法处理超大整数的问题', ha='center', fontsize=8) plt.show()
方案2:利用numpy的uint256类型(需环境支持)
如果你的numpy版本≥1.20,它支持uint256无符号256位整数类型,可以直接转换后绘制直方图:
import numpy as np def plot_histogram(results, bins = 20): # 转换为numpy支持的uint256类型 integer_values = np.array([val for _, _, val in results], dtype=np.uint256) plt.figure(figsize=(10, 6)) plt.hist(integer_values, bins=bins, color='purple', edgecolor='black') plt.title(f'SHA-256整数直方图({bins}个区间)') plt.xlabel('256位整数值') plt.ylabel('频数') # 开启科学计数法显示x轴,避免数值过长 plt.ticklabel_format(style='sci', axis='x', scilimits=(0,0)) plt.grid(axis='y', linestyle='--', linewidth=0.7, alpha=0.7) plt.show()
额外小优化
你原来的plot_histogram函数里有一段冗余代码:
integer_values = [int(integer_value) for _, _, integer_value in results if isinstance(integer_value, int)]
这里的int(integer_value)强制转换和isinstance类型判断都是多余的——你的sha256_to_int函数返回的肯定是整数类型,直接提取即可。
把修改后的函数替换掉原来的版本,再运行代码就能正常生成直方图啦!
备注:内容来源于stack exchange,提问作者Sergio Gonzalez
相关产品推荐
相关产品推荐

