有什么好方法可以生成一个包含在n维点网格上评估的函数值的numpy数组?
例如,假设我要评估由
def func(x, y):
return <some function of x and y>
假设我要在二维点数组上对它进行评估,其中x值以10步从0变为4,y值以20步从-1变为1。在numpy中执行此操作的好方法是什么?
PS这已经在上以各种形式被多次询问,但是我找不到简明扼要的问答。我将其发布以提供简洁的简单解决方案(如下)。
更短,更快和更清晰的答案,避免使用网格:
import numpy as np
def 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)+z
xaxis = 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 numpy
In [2]: a = numpy.linspace(-1,1,20)
In [3]: a.shape
Out[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" here
In [7]: d=b*c
In [8]: d.shape # only the last dimension is "empty" here
Out[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维以上的尺寸。
我觉得我的知识的函数式编程是有点缺乏所以我决定看看网上并按照教程得到更好的当我凸轮通过它的状态在第一页 “假设您有一个不可变的数字列表xs=[1,2,3,4,5,6,7,8]和一个函数doubleMe,该函数将每个元素乘以2,然后返回一个新列表。如果我们想用命令式语言将列表乘以8,并执行doubleMe(doubleMe(xs)))),它可能会通过列表一次,复制一份,然后返回。然后,它将再次通过列
问题内容: 我正在尝试以下代码,该代码向RDD中的每一行添加一个数字,并使用PySpark返回RDD列表。 输入文件(sample.txt)中的内容为: 我期待这样的输出(将rdd中的数字分别添加0、1、2): 而实际输出是: 这意味着无论 范围(4) 为何,该理解仅将值3用于变量i 。 为什么会发生这种现象? 问题答案: 它的发生是由于Python的后期绑定,而不是特定于(Py)Spark的。将
问题内容: 为什么这些示例中的第一个不起作用,而其他所有示例都起作用? 问题答案: 这既不是范围问题,也不是关闭问题。问题在于 声明 和 表达式 之间的理解。 JavaScript代码(即使是Netscape的第一个JavaScript版本和Microsoft的第一个副本)也要分两个阶段处理: 阶段1:编译-在此阶段,代码被编译成语法树(字节码或二进制取决于引擎)。 阶段2:执行-然后解析解析的代
Hubble的计算指标分为活跃性的人均次数指标,提高转化的转化率值指标,效果类的总值型指标。本节将会以效果类的总值型指标作为主要依据,来对实验数据进行解读。 1.1. 关于A/B测试你需要知道的几个概念: 关于A/B测试的科学性 A/B测试本质上是小流量测试,最早应用于药品的测试。自从2000年谷歌工程师开始运用到互联网行业,AB测试已经成为最流行的增长利器。 A/B测试数据的效果评估依赖于统计上
我正在编写一段代码,对给定的后缀表达式求值。每个操作数和运算符之间用空格分隔,最后一个运算符后跟空格和“x”。 例子: 内插表达式:(2*3 4)*(4*3 2) 后缀表达式:23*443*2*x “x”暗示表达的结束。 输入(后缀表达式)作为字符串由另一个函数给出,该函数将内缀表达式转换为后缀表达式。 后缀评估的功能是: 我给出的例子的输出应该是“140”,但我得到的是“6”。请帮我找出错误。
使用方法 性能评估模块提供了一系列用于模型性能评估的函数,这些函数在模型编译时由metrics关键字设置 性能评估函数类似与目标函数, 只不过该性能的评估结果讲不会用于训练. 可以通过字符串来使用域定义的性能评估函数 model.compile(loss='mean_squared_error', optimizer='sgd', metri