Python - 不均匀大小矩阵列积

pythonserver side programmingprogramming

在本文中,我们将学习各种方法,使用这些方法我们可以找到不均匀大小矩阵列的乘积。矩阵的使用在数据分析、机器学习等领域非常常见,因此在某些情况下,我们必须找到矩阵列积,这可能是一项具有挑战性的任务。

让我们看一些查找不均匀大小矩阵列积的示例 -

方法 1:使用简单循环

在此方法中,我们将使用简单嵌套循环的概念,我们将遍历矩阵列并计算它们的乘积。

示例

def col_product_loop(mat):
   prod = []
   max_row_length = max(len(row) for row in mat)
   for col in range(max_row_length):
      col_product = 1
      for row in matrix:
         if col < len(row):
            col_product *= row[col]
         prod.append(col_product)
      return prod

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

products_col = col_product_loop(mat)
print("列的乘积为:", products_col)

输出

列的乘积为:[24, 70, 24, 9]

解释

在上面的程序中,我们注意使用 max(len(row) for row in matrix 迭代大行。在内部循环中,我们添加了一个 if 条件来检查当前列索引是否在行的范围内。如果满足此条件,则我们将索引值相乘。然后将乘积存储在列表中并作为最终结果返回。

方法 2:使用 NumPy

在此方法中,我们将使用 NumPy 的概念,它为我们提供了处理数组和矩阵的操作。

示例

import numpy as np

def col_product_numpy(mat):
   max_len = max(len(row) for row in mat)
   padded_matrix = [row + [1] * (max_len - len(row)) for row in mat]
   return np.product(padded_matrix, axis=0).tolist()

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

products_col = col_product_numpy(mat)
print("列的乘积为:", products_col)

输出

列的乘积为:[24, 70, 24, 9]

解释

在上面的程序中,我们创建了一个新矩阵,其中所有行的长度相同,并且我们用 1 填充了较短的行。将值附加为 1 不会影响最终结果,因为将值乘以 1 将得到相同的值。然后我们计算列的乘积。

方法 3:使用列表推导式

在此方法中,我们将使用列表推导式的概念,它为我们提供了一种创建列表和计算列乘积的有效方法。

示例

def column_product_comprehension(mat):
   max_rw = max(len(row) for row in mat)
   return [eval('*'.join(str(row[col]) for row in mat if col < len(row))) for col in range(max_rw)]

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

products_col = column_product_comprehension(mat)
print("列的乘积为:", products_col)

输出

列的乘积为:[24, 70, 24, 9]

解释

在上面的程序中,我们使用列表推导方法使用 range(max_rw) 迭代列。这里 max_rw 是任何行的最大长度。然后,我们将列中的每个元素与字符串表示中的每一行连接起来。然后我们使用 eval() 方法计算乘积。

方法 4:使用 numpy.prod() 和 np.apply_along_axis()

在此方法中,我们将使用 numpy.prod() 和 np.apply_along_axis() 方法来查找列的乘积。

示例

import numpy as np

def column_product_np_apply(mat):
   max_len = max(len(column) for column in mat)
   padded_matrix = [column + [1] * (max_len - len(column)) for column in mat]
   return np.apply_along_axis(np.prod, axis=0, arr=padded_matrix).tolist()


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

products_col = column_product_np_apply(mat)
print("列的乘积是:", products_col)

输出

列的乘积是:[24, 70, 24, 9]

解释

在上面的程序中,我们使用 numpy.prod() 和 np.apply_along_axis() 方法来获取列的乘积。我们用 1 填充较短的行。将值附加为 1 不会影响最终结果,因为将值乘以 1 将得到相同的值。然后,我们将 np.apply_along_axis 与 np.prod 方法一起应用为函数,并添加 axis=0 以沿每列应用乘积函数。

方法 5:使用 Pandas Dataframe

在此方法中,我们将使用在数据处理中非常流行的 pandas dataframe 库的概念。我们将使用 pandas dataframe 提供的可以处理大小不均匀矩阵的 dataframe 对象。

示例

import pandas as pd

def column_product_pandas(mat):
   df = pd.DataFrame(mat)
   return df.product(axis=0).tolist()


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

products_col = column_product_pandas(mat)
print("列的乘积为:", products_col)

输出

列的乘积为:[24.0, 70.0, 24.0, 9.0]

解释

在上面的程序中,我们使用 pd.DataFrame() 将矩阵转换为 pandas 数据框,并使用 axis=0 的 product() 函数来计算列元素的乘积。

方法 6:使用递归函数

在此方法中,我们将使用递归函数的概念来计算列乘积。

示例

def column_product_recursive(mat, row_i=0, col_i=0, prod=[]):
   if row_i == len(mat):
      return prod

   if col_i == len(mat[row_i]):
      return column_product_recursive(mat, row_i + 1, 0, prod)

   current_element = mat[row_i][col_i]
   if col_i >= len(prod):
      prod.append(current_element)
   else:
      prod[col_i] *= current_element

   return column_product_recursive(mat, row_i, col_i + 1, prod)

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

products_col = column_product_recursive(mat)
print("列的乘积是:", products_col)

输出

列的乘积是:[24, 70, 24, 9]

解释

在上面的程序中,我们调用了一个递归函数,并传递了矩阵以及行索引和列索引,用于跟踪当前正在处理的行和列。我们使用了基本情况,即行的长度将达到矩阵的长度,这表示已处理完所有行。因此,在这种情况下,我们返回产品列表。我们从当前列表中取出元素,并将其与产品列表中存在的元素相乘。如果列的索引大于产品列表的长度,则我们将附加新列表。然后我们通过增加下一列来调用递归函数来处理下一列元素。

结论

因此,我们了解了各种方法,可以使用这些方法计算任何不均匀大小矩阵的列元素的乘积。我们看到了不同的方法来执行此操作,例如循环、列表理解、递归、numpy。您可以选择任何适合您的上述方法。


相关文章


有用资源