AI编程方法第六弹:高效编码离不开编程者经验引导

虽然AI编程工具可以提供快速的代码实现,但是在方法实现上往往并不完全符合我们的预期,甚至可能会使用一些非常原始低效的方式来完成。因此,合理的引导提示AI编程工具进行编程,才能写出更为合理高效的代码,这在一定程度上也说明AI编程并不意味着编程人员无需再学习编程,相反,熟练的编程人员才会更好的引导AI快速实现高效的代码。

下面以一个例子来做说明。比如基于NumPy编写代码,允许用户连续输入一组数据,以0结束,找到平均值最大的连续三个数值,比如输入为:
1,2,3,37,56,23,17,20,30,0 这几个数
输出为:
37,56,23

首先进行的AI编程提示为:

允许用户连续输入一组数据,以0结束,找到平均值最大的连续三个数值,比如输入为:
1,2,3,37,56,23,17,20,30,0 这几个数
输出为:
37,56,23(请使用Python和NumPy完成)

得到的初始代码可能为:

import numpy as np

def find_max_avg_triplet():
    # 读取输入数据,直到遇到0为止
    input_data = []
    while True:
        num = int(input("请输入一个数字(输入0结束): "))
        if num == 0:
            break
        input_data.append(num)
    
    if len(input_data) < 3:
        print("输入的数字不足三个,无法计算。")
        return
    
    # 转换为NumPy数组
    arr = np.array(input_data)
    
    # 初始化最大平均值和对应的索引
    max_avg = -np.inf
    max_indices = (0, 1, 2)
    
    # 滑动窗口计算每个连续三个数的平均值
    for i in range(len(arr) - 2):
        current_triplet = arr[i:i+3]
        current_avg = np.mean(current_triplet)
        if current_avg > max_avg:
            max_avg = current_avg
            max_indices = (i, i+1, i+2)
    
    # 输出结果
    result = arr[max_indices[0]:max_indices[2]+1]
    print("平均值最大的连续三个数值是:", ','.join(map(str, result)))

# 调用函数
find_max_avg_triplet()

该代码虽然功能正确,但是在实现上非常原始,没有充分利用NumPy序列的集合式处理优势。如果觉得代码啰嗦,简单的限制代码函数并不一定能实现预期目标。如再次AI编程提示为:

压缩代码控制在10行内

得到的代码为:

import numpy as np

def find_max_avg_triplet():
    input_data = []
    while (num := int(input("请输入一个数字(输入0结束): "))) != 0: input_data.append(num)
    if len(input_data) < 3: return print("输入的数字不足三个,无法计算。")
    arr = np.array(input_data)
    max_avg, max_indices = -np.inf, (0, 1, 2)
    for i in range(len(arr) - 2):
        if (current_avg := np.mean(arr[i:i+3])) > max_avg: max_avg, max_indices = current_avg, (i, i+1, i+2)
    print("平均值最大的连续三个数值是:", ','.join(map(str, arr[max_indices[0]:max_indices[2]+1])))

find_max_avg_triplet()

该代码相较于以前,确实已有改进,采用了滑窗切片的for循环实现了有效的简化处理,但是其自动去除了连续输入的功能,后期还需要自己替换上去。但是,其核心处理序列的代码是否能更突出NumPy编程特点?

此时,如果自己对该类序列处理有经验,可以明确的引导AI编程工具按照自己指定的思路来完成,如AI编程提示为:

可以考虑不要使用循环,利用每三个切片的滑窗,通过集合式整体处理获取对应每三个切片元素的平均值形成一个array,再利用寻找最大值对应的序号来确定原始三个元素的内容

得到的代码为:

import numpy as np

def find_max_average_triplet(arr):
    # 将输入转换为numpy数组以便高效处理
    arr = np.array(arr)
    # 计算滑动窗口的平均值
    # 使用卷积来高效计算滑动窗口的和,然后除以窗口大小
    window_size = 3
    # 使用valid模式,确保窗口不超出边界
    sums = np.convolve(arr, np.ones(window_size), mode='valid')
    averages = sums / window_size
    
    # 找到最大平均值的索引
    max_avg_index = np.argmax(averages)
    # 对应的原始三个元素
    triplet = arr[max_avg_index:max_avg_index + window_size]
    
    return triplet, averages[max_avg_index]

# 示例使用
if __name__ == "__main__":
    example_array = [1, 3, 5, 7, 9, 2, 4, 6, 8]
    triplet, max_avg = find_max_average_triplet(example_array)
    print(f"原始数组: {example_array}")
    print(f"平均值最大的三个连续元素: {triplet}, 平均值: {max_avg}")

如果觉得不必如此复杂,可以要求简化不必要的语句,再次增加调整提示:

请不要使用函数,去除main代码

得到的代码为:

import numpy as np

# 示例数组
example_array = [1, 3, 5, 7, 9, 2, 4, 6, 8]

# 将输入转换为numpy数组以便高效处理
arr = np.array(example_array)

# 计算滑动窗口的平均值
window_size = 3
sums = np.convolve(arr, np.ones(window_size), mode='valid')
averages = sums / window_size

# 找到最大平均值的索引
max_avg_index = np.argmax(averages)

# 对应的原始三个元素
triplet = arr[max_avg_index:max_avg_index + window_size]

# 输出结果
print(f"原始数组: {example_array}")
print(f"平均值最大的三个连续元素: {triplet}, 平均值: {averages[max_avg_index]}")

这次我们会发现AI灵巧的使用了一个NumPy的卷积函数convolve,自动实现了for循环的滑窗切片,具体对该函数的了解可以直接询问AI。

即使此时不想使用这个convolve函数,也可以再次要求AI编程:

能否不使用convolve函数实现相同的效果

得到的代码为:

import numpy as np

# 示例数组
example_array = [1, 3, 5, 7, 9, 2, 4, 6, 8]

# 将输入转换为numpy数组以便高效处理
arr = np.array(example_array)

# 窗口大小
window_size = 3

# 使用列表推导式初始化滑动窗口的和数组
sums = [np.sum(arr[i:i + window_size]) for i in range(len(arr) - window_size + 1)]

# 计算平均值
averages = np.array(sums) / window_size

# 找到最大平均值的索引
max_avg_index = np.argmax(averages)

# 对应的原始三个元素
triplet = arr[max_avg_index:max_avg_index + window_size]

# 输出结果
print(f"原始数组: {example_array}")
print(f"平均值最大的三个连续元素: {triplet}, 平均值: {averages[max_avg_index]}")

到此,相关代码已经非常简洁,使用的函数也比较常见,可以符合绝大多数普通练习的要求。从中可以看出,编程人员的准确引导是初始AI代码质量获得提升的关键一步。

你可能感兴趣的:(AI编程,AI编程,NumPy,数组,查找)