【问题标题】:Computing grid computations using numpy meshgrid使用 numpy meshgrid 计算网格计算
【发布时间】:2019-12-22 03:43:33
【问题描述】:

我使用 numpy 网格网格已经很长时间了,并且在尝试通过函数传递网格网格时通常没有发现任何问题。根据我的经验,我总是可以将我的坐标空间定义为

x,y,z = numpy.meshgrid(numpy.linspace(-10,10,10),
                       numpy.linspace(-10,10,10),
                       numpy.linspace(-10,10,10))

然后可以很容易地计算出类似的东西 u,v,w = numpy.sin(x*y)+numpy.cos(z).

我的问题源于需要在该计算中进行叉积。我正在使用网格网格定义一个字段,并尝试通过函数传递整个网格网格:

field_equation = lambda x,y,z: sum([parameter*np.cross([wire_x[i],wire_y[i],wire_z[i]],[x,y,z]) for i in range(len(wire))])

根据我尝试解决问题的方式,我会遇到很多问题。该代码在一次通过一个点(x,y,z)时运行良好,但无法计算整个字段。我该如何解决这个问题?

【问题讨论】:

  • 什么是wire? (如果数组它的维度是多少?)parameter 相同?
  • @9mat:wire 是一个基本上由 3 个点列表 (x,y,z) 组成的类。因此,wire_x[i] 是一个单独的数字。参数是一个浮点数。

标签: python arrays numpy simulation


【解决方案1】:

np.cross 只接受大小为 3 的向量,或者最后一维大小为 3 的 nd-array,所以我们需要先将 np.stack([x,y,z]) 堆叠起来创建一个 10*10*10*3 nd-array。

结果将是一个10*10*10*3 数组,为了以后能够解包这个数组,我们需要将其转置为3*10*10*10 的大小,所以我在最后交换了结果数组的轴。

在下面的代码中,我还冒昧地将代码 wrt wire 缩短了一点,假设 wire_x, wire_y, wire_z 只是 wire 的 3 个组成部分。

import numpy as np

# test data
x,y,z = np.meshgrid(np.linspace(-10,10,10),
                    np.linspace(-10,10,10),
                    np.linspace(-10,10,10))

wire = [[1,2,3,4], [5,6,7,8], [3,4,5,6]]
parameter = 1

field_equation = lambda x,y,z: sum([parameter*np.cross(w, np.stack([x,y,z], axis=-1)) for w in zip(*wire)]).swapaxes(0,-1)

a,b,c = field_equation(x,y,z)
print(a.shape, b.shape, c.shape)

#(10, 10, 10) (10, 10, 10) (10, 10, 10)

【讨论】:

  • 这很好用,除了在传递单个值时,代码是正确的,但是使用网格网格会产生不正确的结果。我完全不确定为什么......
猜你喜欢
  • 2018-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2013-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多