如何对2D numpy数组的指定列分别执行np.floor和np.ceil运算
numpy数组按列应用不同取整函数实现方法
你原来的写法错误是因为第一行执行b = np.floor(a[:,0])之后,b已经变成了仅包含第一列的一维数组,后续再访问b[:,1]会直接抛出索引越界错误。
基础实现(满足第一列向下取整、后两列向上取整需求)
import numpy as np # 示例数组a a = np.array([ [-72.86, -13.56, 68.45], [-58.31, -14.98, 54.76], [29.16, 7.23, -27.38] ]) # 先创建原数组的完整副本,避免修改原数组 b = a.copy() # 分别对每一列执行对应取整操作,直接赋值到副本对应列 b[:, 0] = np.floor(b[:, 0]) # 第一列向下取整 b[:, 1] = np.ceil(b[:, 1]) # 第二列向上取整 b[:, 2] = np.ceil(b[:, 2]) # 第三列向上取整
运行后得到的b结果为:
[[-73. -13. 69.] [-59. -14. 55.] [ 29. 8. -27.]]
如果需要得到整数类型的结果,可以在最后加一行b = b.astype(int)转换格式。
支持8种取整组合的通用实现
如果需要快速切换3列共8种floor/ceil的取整组合,可以封装为通用函数,传入对应列的取整方法即可:
def custom_round(arr, col_funcs): res = arr.copy() for col_idx, func in enumerate(col_funcs): res[:, col_idx] = func(res[:, col_idx]) return res # 用法示例:对应第一列floor、第二列ceil、第三列ceil b = custom_round(a, [np.floor, np.ceil, np.ceil]) # 切换其他组合只需修改传入的函数列表即可,比如三列全向下取整就传[np.floor, np.floor, np.floor]
内容的提问来源于stack exchange,提问作者0xREDACTED
相关产品推荐
相关产品推荐

