如何将for循环结果垂直堆叠为70×35的二维ndarray?
问题解决:正确生成70×35的预测概率数组
问题原因
你初始化predicted_probabilities为(70,35)的空数组,之后每次循环用vstack把新的result(形状(1,35))追加进去。循环70次后,原本的70行加上新增的70行,总形状就变成了140×35,这就是重复追加的核心原因。
两种正确实现方式
方式1:初始化空数组,循环堆叠
import numpy as np actual_values_images = [] predicted_values_images = [] predicted_probabilities_images = [] # 初始化为空数组,而非预设70行 predicted_probabilities = np.empty((0, 35), dtype=np.float32) for testImage in test_image_folder: img = folder_path + str(testImage) img = image.load_img(img, target_size=(64, 64)) img = image.img_to_array(img) img = np.expand_dims(img, axis=0) result = classifier.predict(img, verbose=0) actual_values_images.append(str(testImage[1:-4])) # 垂直堆叠新的预测结果 predicted_probabilities = np.vstack([predicted_probabilities, result]) predicted_values_images.append(ResultMap[np.argmax(result)]) predicted_probabilities_images.append(result)
初始空数组形状为(0,35),每次堆叠(1,35)的result,循环70次后正好得到(70,35)的数组。
方式2:预分配数组,索引赋值(更高效)
import numpy as np actual_values_images = [] predicted_values_images = [] predicted_probabilities_images = [] # 预分配70×35的浮点数数组(预测概率是浮点数,不要用int类型) predicted_probabilities = np.empty((70, 35), dtype=np.float32) for idx, testImage in enumerate(test_image_folder): img = folder_path + str(testImage) img = image.load_img(img, target_size=(64, 64)) img = image.img_to_array(img) img = np.expand_dims(img, axis=0) result = classifier.predict(img, verbose=0) actual_values_images.append(str(testImage[1:-4])) # 直接通过索引替换对应行 predicted_probabilities[idx] = result predicted_values_images.append(ResultMap[np.argmax(result)]) predicted_probabilities_images.append(result)
用enumerate获取循环索引idx,直接将result赋值给数组的对应行,避免多次数组拼接的性能损耗,同时保证数据类型正确(浮点数存储概率值)。
额外注意
- 原代码中
predicted_probabilities_images未提前初始化,记得要在循环前定义该列表 - 预测概率是浮点数,不要用
int类型存储,否则会丢失精度(比如把0.8这类概率值强制转为0)
内容的提问来源于stack exchange,提问作者Dakshila Kamalsooriya
相关产品推荐
相关产品推荐

