0

0

NumPy从函数生成数组_np.fromfunction()按坐标生成规律值矩阵

P粉602998670

P粉602998670

发布时间:2026-03-10 18:43:58

|

783人浏览过

|

来源于php中文网

原创

np.fromfunction本质是广播式坐标计算,非逐点循环;函数需接收与shape维数相同的ndarray参数并返回同形数组,dtype默认float64易致索引错误,应显式设dtype=int并避免python循环。

numpy从函数生成数组_np.fromfunction()按坐标生成规律值矩阵

np.fromfunction 本质是“按坐标调用函数”,不是“对每个元素循环赋值”

它把整个坐标网格(比如 np.indices((3,4)) 那种)一次性传给你的函数,函数必须能接收多个数组参数,并返回一个同形状的数组。很多人误以为它是逐点调用,结果写了个只接受标量的函数,直接报 ValueError: setting an array element with a sequence

实操建议:

  • 你的函数签名得是 def f(i, j):lambda i, j: i + j,其中 ijnp.ndarray,不是单个数字
  • 别在函数里写 for 循环遍历 ij —— 它们已经是整张索引表了
  • 如果逻辑太复杂、没法向量化,别硬套 np.fromfunction,改用 np.zeros(shape) + 显式索引更稳

shape 参数是输出数组尺寸,不是函数参数个数

np.fromfunction(f, (5, 3))f 会收到两个参数(第一维索引数组、第二维索引数组),哪怕你函数只用了其中一个。常见错误是传了 (5,) 却还写 def f(i, j):,导致 TypeError: f() missing 1 required positional argument

实操建议:

  • shape 的长度决定传入函数的参数个数:一维 shape → 1 个参数,二维 → 2 个,三维 → 3 个
  • 参数名无所谓,但顺序固定:第 0 轴索引最先,第 1 轴次之……例如 np.fromfunction(f, (2, 4, 3)) 会调用 f(i, j, k),其中 i.shape == (2,4,3)
  • 如果想生成列向量(比如 (5, 1)),别漏掉那个 1:写成 (5,) 就只剩一维,行为完全不同

默认 dtype 是 float64,整数索引函数容易意外溢出或截断

np.fromfunction 内部生成的坐标数组默认是 float64,哪怕你 shape 全是整数。如果你的函数里做了取模、位运算或下标查找(比如 arr[i % len(arr)]),i 是浮点数就会出错 —— TypeError: only integer scalar arrays can be converted to a scalar index

NNiji·Journey
NNiji·Journey

二次元风格绘画生成器,由 Spellbrush 与 Midjourney 共同设计开发

下载

实操建议:

  • 显式传 dtype=intnp.fromfunction(f, (4, 4), dtype=int),这样 ij 就是整型数组
  • 如果函数本身需要 float 计算但最后要 int 输出,别依赖自动转换;在函数末尾加 .astype(int) 更可控
  • 注意 dtype=int 在老版本 NumPy 中可能触发弃用警告,此时用 dtype=np.int64 更稳妥

性能陷阱:函数体不能含 Python 循环或慢操作

它的优势在于把索引广播一次就全算完。一旦你在传入的函数里写了 forif 分支太多、或调用非向量化 Python 函数(如 math.sin),性能反而比不上预分配 + for 嵌套,还更难 debug。

实操建议:

  • 优先用 NumPy 自带函数:np.sin 而非 math.sinnp.where 替代 if/else
  • 避免在函数里查字典、读文件、调用 print —— 这些不会报错但会让整个数组生成变慢几个数量级
  • 不确定是否向量化?先用小 shape 测试,timeit 对比 np.fromfunction 和双循环写法

真正难的是把业务逻辑“翻译”成广播友好的数组操作,而不是记住语法。写不出来就别强求,NumPy 不强迫你每一行都向量化。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

18

2026.02.03

css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

594

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

105

2025.10.23

if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

846

2023.08.22

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1010

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

608

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

314

2025.08.29

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

4

2026.03.10

热门下载

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

精品课程

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

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