【问题标题】:Sample a data volume along an arbitrary surface probe沿任意表面探针对数据体进行采样
【发布时间】:2013-09-11 11:58:12
【问题描述】:

在 numpy 中,使用 m 维探针(m

o = [0, 0, 0] # origin
v1 = [1, 0, 0]; l1=1 # First vector and length
v2 = [0, 1, 0]; l2=1 # Second vector and length

ds1,ds2 = 10,10 # samples per direction

l1x,l1y,l1z = np.linspace(o[0],v1[0]*l1,ds1),np.linspace(o[1],v1[1]*l1,ds1),np.linspace(o[2],v1[2]*l1,ds1)
l2x,l2y,l2z = np.linspace(o[0],v2[0]*l2,ds2),np.linspace(o[1],v2[1]*l2,ds2),np.linspace(o[2],v1[2]*l2,ds2)
llx, lly, llz = l1x, l1y, l1z

# shift points in direction of 2nd vector and append 
for i in range(1,ds2):
  llx = np.hstack((llx,l1x+l2x[i]))
  lly = np.hstack((lly,l1y+l2y[i]))
  llz = np.hstack((llz,l1z+l2z[i]))

ptcoords = np.vstack((llx,lly,llz)).T 

编辑: 我找到了一种更简洁的表达方式:使用l pxn 数组列表(例如 p=3,n=10,10 个 3D 点的数组或线性探针),其中 m 在整个列表中是固定的,但 n可以因元素而异,此代码将构建整个探测数组:

base = l[0] # if l[0] is the only one
for ll in l[1:]:
  n = ll.shape[0]
  nb = base.shape[0]
  base = np.repeat(ll,nb,0) + np.vstack(np.hsplit(np.tile(base,n),n))

不过,我认为循环和大量的数组操作是可以避免的!我已经在一些 3D 配置上对其进行了测试,这是一个屏幕截图。让我知道您是否可以优雅或找到错误。

【问题讨论】:

  • 如果您可以导入 scipy,那么您可以从 interpolate 模块尝试 interp2d(来自 scipy.interpolate import interp2d)。
  • @Katsu - 谢谢,但 inter2pd 仅适用于 2D。我需要ND。
  • 可能是griddata 似乎做你想做的事。
  • @Katsu,再次感谢,这是解决一半问题的好答案。在griddata之前我需要的是一个通用的mgrid。 griddata 适用于在数据块中使用广义 mgrid 生成的探测点执行插值。

标签: python arrays numpy scipy


【解决方案1】:

对于 3D 数据和 2D 剪辑,我一直在使用 Mayavi。非常粗略地,您需要执行以下步骤:加载数据、添加 delaunay 三角剖分过滤器、可视化体积、添加标量切割平面、定位并读出数据。

【讨论】:

  • 感谢 Christian,我知道这种方法。 VTK 也为此提供了工具,但我想我想直接用 numpy 解决它,因为它只是矩阵操作 + 插值。
猜你喜欢
  • 1970-01-01
  • 2020-12-30
  • 1970-01-01
  • 1970-01-01
  • 2018-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 1970-01-01
相关资源
最近更新 更多