Python - 不等尺寸矩陣列最小值


在 Python 中,當處理行長度不一的矩陣時,找到每列最小值的效率至關重要。有多種方法可以解決此任務,每種方法都有其自身的優勢和適用場景。本文將深入探討幾種方法:從基本的巢狀迴圈到高階工具,如 NumPy 和 Pandas。

最終,您將全面掌握兩項關鍵技能:掌握不等尺寸矩陣的操作以及從中提取有價值的資訊。

方法 1:使用巢狀迴圈

此方法使用巢狀迴圈遍歷矩陣,並仔細記錄每列的最小值。雖然此方法對於較小的矩陣有效,但當應用於較大的資料集時,其效率可能會下降。

示例

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
max_row_length = max(len(row) for row in matrix)

column_minima = [float('inf')] * max_row_length

for row in matrix:
   for i, value in enumerate(row):
      # Update the minimum value for each column
      column_minima[i] = min(column_minima[i], value)

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {minimum}")

輸出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 2:使用 NumPy

使用 NumPy 可以高效地處理矩陣:建立一個填充 NaN 值的陣列,然後用矩陣資料填充此陣列。隨後使用 np.nanmin 可以識別每列的最小值,從而證實 NumPy 在處理數值資料方面表現出色。

示例

import numpy as np

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
max_row_length = max(len(row) for row in matrix)

# Create a NumPy array filled with NaN values
np_matrix = np.empty((len(matrix), max_row_length))
np_matrix[:] = np.nan

# Fill the NumPy array with matrix values
for i, row in enumerate(matrix):
   np_matrix[i, :len(row)] = row

# Find the minimum values in each column
column_minima = np.nanmin(np_matrix, axis=0)

# Print the minimum values for each column
for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {int(minimum)}")

輸出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 3:使用列表推導式

使用列表推導式是確定每列最小值的一種巧妙方法:它迭代遍歷矩陣,為每一列生成一個最小值的列表。這種系統化的方法不僅簡化了可讀性,還提高了效率,因此使其成為一種最佳方法。

示例

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
column_minima = [min(row[i] for row in matrix if i < len(row)) for i in range(max(len(row) for row in matrix))]

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {minimum}")

輸出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 4:使用 itertools.zip_longest

使用 Python 的 itertools 庫,此程式碼片段識別可變大小矩陣中每列的最小值:首先,它轉置該矩陣,使用 zip_longest 解包其行,從而確保所有列都具有相同的長度,方法是用 float('inf') 填充任何缺失的值。然後,它透過使用列表推導式計算每列的最小值。最後,程式遍歷生成的列最小值列表,並列印它們——此過程會產生一個輸出,該輸出顯示原始矩陣中每列的最小值。

示例

from itertools import zip_longest

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]

# Transpose the matrix and use zip_longest
transposed = zip_longest(*matrix, fillvalue=float('inf'))

column_minima = [min(col) for col in transposed]

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {minimum}")

輸出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 5:使用自定義函式

我們建立一個自定義函式來查詢每列中的最小值;它透過迭代矩陣來執行,並在其過程中維護一個每列最小值的列表。此方法提供的靈活性和自定義選項值得注意:它們極大地提升了我們對資料管理的方法。

示例

def min_values_in_columns(matrix):
   column_minima = [float('inf')] * max(len(row) for row in matrix)
   for row in matrix:
      for i, value in enumerate(row):
         column_minima[i] = min(column_minima[i], value)
   return column_minima

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]

column_minima = min_values_in_columns(matrix)

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {minimum}")

輸出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 6:使用 defaultdict

collections 模組的 defaultdict 簡化了查詢每列最小值的步驟:它迴圈遍歷矩陣,在其類似字典的配置中系統地更新每列的最小值。

示例

from collections import defaultdict

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
column_minima = defaultdict(lambda: float('inf'))

for row in matrix:
   for i, value in enumerate(row):
      column_minima[i] = min(column_minima[i], value)
for i, minimum in column_minima.items():
   print(f"Minimum value in column {i}: {minimum}")

輸出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 7:使用 Pandas

Pandas - 這是一個用於資料操作的功能強大的庫。透過從矩陣建立 Pandas DataFrame,我們使用 min 函式來確定每列的最小值——Pandas 在處理結構化資料時尤其擅長此任務。

示例

import pandas as pd

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
df = pd.DataFrame(matrix)

column_minima = df.min()

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {int(minimum)}")

輸出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

結論

在我們探索各種查詢不等尺寸矩陣中每列最小值的方法,特別是使用 Python 時:我們遇到了各種策略,從簡單的巢狀迴圈和列表推導式到專門的工具,如 NumPy 和 Pandas。您選擇的方法應取決於兩個主要因素:您資料固有的獨特特徵;以及與您的任務相關的效能要求。優先考慮可讀性、數值效率或多功能性;每種方法都值得一試——一種可以巧妙地處理適合您需求的各種矩陣結構的方法。

更新於: 2023-11-02

109 次瀏覽

開啟您的 職業生涯

透過完成課程獲得認證

開始學習
廣告