boxmoe_header_banner_img

Hello! 欢迎来到悠悠畅享网!

文章导读

将一维数组重塑为接近正方形的矩阵


avatar
作者 2025年9月13日 9

将一维数组重塑为接近正方形的矩阵

本文探讨了如何将一维 numpy 数组重塑为尽可能接近正方形的二维矩阵,即找到两个因子 p 和 q,使得 p * q 等于数组长度 n,且 p 尽可能接近 sqrt(n)。文章提供了两种实现方法:一种是速度更快的简单方法,适用于较小的 n;另一种是更通用的方法,基于质因数分解和幂集搜索,适用于更复杂的情况。同时,文章也给出了示例代码,展示了如何使用这些方法进行数组重塑。

在数据处理和分析中,经常需要将一维数组转换为二维矩阵。当需要将数据可视化或进行矩阵运算时,这种转换尤为重要。如果希望得到的矩阵尽可能接近正方形,就需要找到合适的行数和列数。 本文将介绍如何使用 NumPy 实现这一目标。

寻找最接近正方形的因子

核心问题在于找到两个整数 p 和 q,使得它们的乘积等于给定数 n,并且 p 和 q 的差值尽可能小。换句话说,我们需要找到最接近 sqrt(n) 的 n 的因子。

快速方法(适用于较小的 n)

以下代码提供了一种简单且快速的方法来找到最接近正方形的因子。该方法通过遍历小于 sqrt(n) 的所有整数,找到能够整除 n 的最大整数。

import numpy as np from math import isqrt  def np_squarishrt(n):     a = np.arange(1, isqrt(n) + 1, dtype=int)     b = n // a     i = np.where(a * b == n)[0][-1]     return a[i], b[i]

代码解释:

  1. isqrt(n): 计算 n 的整数平方根。
  2. np.arange(1, isqrt(n) + 1, dtype=int): 创建一个从 1 到 n 的整数平方根的 NumPy 数组。
  3. b = n // a: 计算 n 除以 a 的整数商。
  4. np.where(a * b == n)[0][-1]: 找到 a * b 等于 n 的索引。
  5. return a[i], b[i]: 返回 a 和 b 的值。

使用示例:

将一维数组重塑为接近正方形的矩阵

Type

生成草稿,转换文本,获得写作帮助-等等。

将一维数组重塑为接近正方形的矩阵36

查看详情 将一维数组重塑为接近正方形的矩阵

n = 500 p, q = np_squarishrt(n) print(f"Factors of {n}: {p}, {q}")  # Output: Factors of 500: 20, 25  a = np.arange(500) b = a.reshape(np_squarishrt(len(a))) print(b.shape) # Output: (20, 25)

通用方法(适用于更复杂的情况)

如果 n 的因子比较复杂,或者需要更精确的控制,可以使用基于质因数分解和幂集搜索的方法。

from itertools import chain, combinations from math import isqrt  def factors(n):     i = 2     while i * i <= n:         if n % i:             i += 1         else:             n //= i             yield i     if n > 1:         yield n  def uniq_powerset(iterable):     """     Similar to powerset(it) but without repeats.      uniq_powerset([1,1,2]) --> (), (1,), (2,), (1, 1), (1, 2), (1, 1, 2)     """     s = list(iterable)     return chain.from_iterable(set(combinations(s, r)) for r in range(len(s)+1))  def squarishrt(n):     p = isqrt(n)     if p**2 == n:         return p, p     bestp = 1     f = list(factors(n))     for t in uniq_powerset(f):         if 2 * len(t) > len(f):             break         p = np.prod(t) if t else 1         q = n // p         if p > q:             p, q = q, p         if p > bestp:             bestp = p     return bestp, n // bestp

代码解释:

  1. factors(n): 使用试除法进行质因数分解,返回 n 的所有质因子。
  2. uniq_powerset(iterable): 生成输入可迭代对象的所有唯一组合(幂集),避免重复组合。
  3. squarishrt(n): 首先计算 n 的整数平方根。然后,找到 n 的所有质因子,并生成所有可能的组合。对于每个组合,计算 p 和 q 的值,并更新 bestp 以找到最接近正方形的因子。

使用示例:

将一维数组重塑为接近正方形的矩阵

Type

生成草稿,转换文本,获得写作帮助-等等。

将一维数组重塑为接近正方形的矩阵36

查看详情 将一维数组重塑为接近正方形的矩阵

n = 500 p, q = squarishrt(n) print(f"Factors of {n}: {p}, {q}")  # Output: Factors of 500: 20, 25  a = np.arange(500) b = a.reshape(squarishrt(len(a))) print(b.shape) # Output: (20, 25)

注意事项

  • np_squarishrt 函数在处理较大数字时可能效率较低,因为它需要遍历所有小于平方根的整数。
  • squarishrt 函数使用质因数分解,对于非常大的数字,分解过程可能比较耗时。
  • 在选择使用哪种方法时,需要根据实际情况进行权衡。如果数字较小,可以使用 np_squarishrt 函数。如果需要处理较大的数字或者需要更精确的控制,可以使用 squarishrt 函数。

总结

本文介绍了两种将一维 NumPy 数组重塑为接近正方形的二维矩阵的方法。第一种方法适用于较小的数字,速度更快。第二种方法适用于更复杂的情况,但计算量更大。 通过这些方法,可以灵活地将一维数组转换为二维矩阵,以便进行后续的数据处理和分析。在实际应用中,可以根据数据规模和性能要求选择合适的方法。



评论(已关闭)

评论已关闭