不用迴圈計算 Pokémon 的總和與平均
一個包含 720 隻 Pokémon 的清單已載入為 names。每隻 Pokémon 對應的能力值已載入為 NumPy 陣列 stats。stats 的每一列對應 names 中的一隻 Pokémon,而每一欄分別代表該 Pokémon 的能力值(依序為 HP、Attack、Defense、Special Attack、Special Defense、Speed)。
你想蒐集每隻 Pokémon 的能力值總和(也就是 stats 每一列的加總)與能力值平均(也就是 stats 每一列的平均),好找出最強的 Pokémon。
以下的 for 迴圈原本用來收集這些數值:
poke_list = []
for pokemon,row in zip(names, stats):
total_stats = np.sum(row)
avg_stats = np.mean(row)
poke_list.append((pokemon, total_stats, avg_stats))
本練習屬於課程
撰寫高效的 Python 程式碼
練習說明
- 使用 NumPy 取代上面的 for 迴圈:
- 使用
.sum()並指定正確的軸,建立總能力值陣列(total_stats_np)。 - 使用
.mean()並指定正確的軸,建立平均能力值陣列(avg_stats_np)。 - 將
names清單、total_stats_np陣列與avg_stats_np陣列結合,建立最終輸出清單(poke_list_np)。
- 使用
動手互動練習
試著完成這個範例程式碼,體驗一下這個練習。
# Create a total stats array
total_stats_np = ____.____(axis=____)
# Create an average stats array
avg_stats_np = ____
# Combine names, total_stats_np, and avg_stats_np into a list
poke_list_np = [*____(names, total_stats_np, avg_stats_np)]
print(poke_list_np == poke_list, '\n')
print(poke_list_np[:3])
print(poke_list[:3], '\n')
top_3 = sorted(poke_list_np, key=lambda x: x[1], reverse=True)[:3]
print('3 strongest Pokémon:\n{}'.format(top_3))