栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 面试经验 > 面试问答

numpy-在点网格上评估函数

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

numpy-在点网格上评估函数

更短,更快和更清晰的答案,避免使用网格:

import numpy as npdef func(x, y):    return np.sin(y * x)xaxis = np.linspace(0, 4, 10)yaxis = np.linspace(-1, 1, 20)result = func(xaxis[:,None], yaxis[None,:])

如果您将x ^ 2 + y之类的函数用作函数,则在内存中的存储速度会更快,因为x ^ 2比1D数组(而不是2D数组)更复杂,并且只有在执行“
+”。对于meshgrid,x ^ 2将在2D数组上完成,其中基本上每一行都是相同的,这会导致大量的时间增加。

编辑:“ x [:,None]”,使x成为2D数组,但第二维为空。此“无”与使用“ x
[:,numpy.newaxis]”相同。Y可以完成相同的操作,但是要创建一个空的第一维。

编辑:3维:

def func2(x, y, z):    return np.sin(y * x)+zxaxis = np.linspace(0, 4, 10)yaxis = np.linspace(-1, 1, 20)zaxis = np.linspace(0, 1, 20)result2 = func2(xaxis[:,None,None], yaxis[None,:,None],zaxis[None,None,:])

这样,您就可以轻松地扩展到N维,如果你愿意的话,使用尽可能多

None
:
作为你的尺寸。每个都有
:
一个维度,每个都有
None
一个“空”维度。下一个示例显示了更多这些空白尺寸的工作方式。如您所见,如果使用
None
,形状会发生变化,在下一个示例中表明它是3D对象,但是只有当您乘以实际上具有这些尺寸中某些内容的对象时,空白尺寸才会被填充(听起来很复杂,但是下一个例子显示了我的意思)

In [1]: import numpyIn [2]: a = numpy.linspace(-1,1,20)In [3]: a.shapeOut[3]: (20,)In [4]: a[None,:,None].shape Out[4]: (1, 20, 1)In [5]: b = a[None,:,None] # this is a 3D array, but with the first and third dimension being "empty"In [6]: c = a[:,None,None] # same, but last two dimensions are "empty" hereIn [7]: d=b*cIn [8]: d.shape # only the last dimension is "empty" hereOut[8]: (20, 20, 1)

编辑:无需自己输入None

def ndm(*args):    return [x[(None,)*i+(slice(None),)+(None,)*(len(args)-i-1)] for i, x in enumerate(args)]x2,y2,z2  = ndm(xaxis,yaxis,zaxis)result3 = func2(x2,y2,z2)

这样,通过将

None
ndm的第一个参数作为第一个完整尺寸,将第二个作为第二个完整尺寸,以此类推,从而创建了额外的空尺寸,它的作用与“硬编码”相同之前使用的语法。

简短说明:做

x2, y2, z2 = ndm(xaxis, yaxis, zaxis)
与做相同

x2 = xaxis[:,None,None]y2 = yaxis[None,:,None]z2 = zaxis[None,None,:]

但是ndm方法也应该适用于更大的维度,而无需

None
像上面显示的那样多行对-
slice进行硬编码。这也将在1.8之前的numpy版本中工作,而numpy.meshgrid仅在numpy 1.8或更高版本中才适用于2维以上的尺寸。



转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/640057.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号