0

0

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

DDD

DDD

发布时间:2025-09-13 21:45:00

|

257人浏览过

|

来源于php中文网

原创

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

本文旨在解决将一维 NumPy 数组重塑为尽可能接近正方形的二维数组的问题。由于并非所有数字都能完美分解为两个相等的整数,因此我们需要找到两个因子,它们的乘积等于数组的长度,并且尽可能接近。本文将提供几种实现此目的的方法,包括快速方法和更全面的方法,并提供代码示例。

问题背景

在数据处理和科学计算中,经常需要将数据从一种形状转换为另一种形状。NumPy 提供了强大的 reshape 函数来实现这一点。然而,当需要将一维数组重塑为二维数组,并且希望二维数组的形状尽可能接近正方形时,问题就变得稍微复杂。例如,如果有一个长度为 500 的一维数组,我们希望将其重塑为一个形状接近 (22, 22) 的二维数组。

解决方案

由于500无法开平方得到整数,无法直接重塑为正方形。因此,需要找到两个整数p和q,使得p*q=500,且p和q尽可能接近。

1. 快速方法

对于较小的 n 值,可以使用以下方法快速找到最接近的因子:

import numpy as np
from math import isqrt

def np_squarishrt(n):
    """
    Finds two factors of n, p and q, such that p * q == n and p is as close as possible to sqrt(n).
    """
    a = np.arange(1, isqrt(n) + 1, dtype=int) # Changed to include isqrt(n) itself
    b = n // a
    i = np.where(a * b == n)[0][-1]
    return a[i], b[i]

此函数首先生成一个从 1 到 sqrt(n) 的整数数组。然后,它计算 n 除以每个整数的结果。最后,它找到 a * b == n 的最后一个索引,并返回对应的 a 和 b 值。

示例:

数组应用&二维数组 word版
数组应用&二维数组 word版

所谓数组,就是相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。数组是在程序设计中,为了处理方便, 把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组。 数组应用&二维数组目录 1. 数组的简单应用2. 数组排序3. 数组查找4. 数组的使用思想5. 查表法6. 二维数组7. 数组综合

下载
a = np.arange(500)
b = a.reshape(np_squarishrt(len(a)))
print(b.shape)  # 输出 (20, 25)

2. 更全面的方法

对于更大的 n 值,或者当需要更精确的控制时,可以使用以下方法:

from itertools import chain, combinations
from math import isqrt
import numpy as np

def factors(n):
    """
    Generates the prime factors of n using the Sieve of Eratosthenes.
    """
    while n > 1:
        for i in range(2, int(n + 1)): # Changed n to int(n + 1) to avoid float errors
            if n % i == 0:
                n //= i
                yield i
                break


def uniq_powerset(iterable):
    """
    Generates the unique combinations of elements from an iterable.
    """
    s = list(iterable)
    return chain.from_iterable(set(combinations(s, r)) for r in range(len(s)+1))


def squarishrt(n):
    """
    Finds two factors of n, p and q, such that p * q == n and p is as close as possible to sqrt(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

此方法首先使用 factors 函数找到 n 的所有质因数。然后,它使用 uniq_powerset 函数生成所有可能的质因数组合。最后,它遍历所有组合,找到两个因子 p 和 q,它们的乘积等于 n,并且 p 尽可能接近 sqrt(n)。

示例:

a = np.arange(500)
b = a.reshape(squarishrt(len(a)))
print(b.shape)  # 输出 (20, 25)

3. 总结和注意事项

  • 选择合适的算法: 对于小规模数据,np_squarishrt 函数通常足够快。对于大规模数据或需要更高精度的情况,squarishrt 函数可能更合适。
  • 数据类型: 确保输入数组的数据类型与计算过程兼容。
  • 错误处理: 在实际应用中,应该添加错误处理机制,例如检查输入是否为正整数。
  • 性能优化: 对于性能敏感的应用,可以考虑使用更高效的质因数分解算法。

通过以上方法,我们可以有效地将一维 NumPy 数组重塑为形状接近正方形的二维数组,从而方便后续的数据处理和分析。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

309

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

408

2023.08.14

PHP 高并发与性能优化
PHP 高并发与性能优化

本专题聚焦 PHP 在高并发场景下的性能优化与系统调优,内容涵盖 Nginx 与 PHP-FPM 优化、Opcode 缓存、Redis/Memcached 应用、异步任务队列、数据库优化、代码性能分析与瓶颈排查。通过实战案例(如高并发接口优化、缓存系统设计、秒杀活动实现),帮助学习者掌握 构建高性能PHP后端系统的核心能力。

101

2025.10.16

PHP 数据库操作与性能优化
PHP 数据库操作与性能优化

本专题聚焦于PHP在数据库开发中的核心应用,详细讲解PDO与MySQLi的使用方法、预处理语句、事务控制与安全防注入策略。同时深入分析SQL查询优化、索引设计、慢查询排查等性能提升手段。通过实战案例帮助开发者构建高效、安全、可扩展的PHP数据库应用系统。

86

2025.11.13

JavaScript 性能优化与前端调优
JavaScript 性能优化与前端调优

本专题系统讲解 JavaScript 性能优化的核心技术,涵盖页面加载优化、异步编程、内存管理、事件代理、代码分割、懒加载、浏览器缓存机制等。通过多个实际项目示例,帮助开发者掌握 如何通过前端调优提升网站性能,减少加载时间,提高用户体验与页面响应速度。

29

2025.12.30

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

24

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

7

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

28

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号