【问题标题】:Sorting 3d arrays in python as per grid根据网格在python中对3d数组进行排序
【发布时间】:2015-11-21 19:37:12
【问题描述】:

我在 3d 中有网格点,我想使用 python 基于 (x,y,z) 对它们进行排序(如果可能避免循环)..

例如,如果输入是,
(1,2,1), (0,8,1), (1,0,0) ..
那么输出应该是
(0,8,1), (1,0,0), (1,2,1)..


很抱歉这条支线,但我实际上正在做的是从具有以下方式的数据的文件中读取:
x y z f(x) f(y) f(z).. 我正在做的事情是:

def fill_array(output_array,source_array,nx,ny,nz,position):
for i in range(nx):
    for j in range(ny):
        for k in range(nz):
            output_array[i][j][k] = source_array[i][j][k][position]
nx = 8
ny = 8
nz = 8

ndim = 6

x = np.zeros((nx,ny,nz))
y = np.zeros((nx,ny,nz))
z = np.zeros((nx,ny,nz))
bx = np.zeros((nx,ny,nz))
by = np.zeros((nx,ny,nz))
bz = np.zeros((nx,ny,nz))

data_file = np.loadtxt('datafile')
f = np.reshape(data_file, (nx,ny,nz,ndim))
fill_array(x,f,nx,ny,nz,0))
fill_array(y,f,nx,ny,nz,1)
fill_array(z,f,nx,ny,nz,2)
fill_array(fx,f,nx,ny,nz,3)
fill_array(fy,f,nx,ny,nz,4)
fill_array(fz,f,nx,ny,nz,5)

当数据被安排(如前所述)时工作正常,但文件写入不按顺序,这会在以后的绘图中产生问题。有没有更好的方法来做到这一点?当然我只想把x,y,z排好,然后把函数值f(x),f(y),f(z)关联到它的正确位置(x,y,z)

两个更新
1) 当我使用 x、y、z、fx、fy、fz 或 f 进行排序时,出现以下错误。

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

2)我需要它以这种特定方式,因为我使用 mayavi 然后用于 contour3d

【问题讨论】:

  • 如果点是列表中三个数字的序列(列表或元组),命名为points,只需使用sorted(points)
  • 谢谢。能否请您检查更新后的问题并提出您的建议。
  • 更新后的问题是一个完全不同的问题。 SO线程不应该是实时聊天......我建议为此切线提出一个新问题。在新问题中,显示您的源数据(文件)和目标格式(对于 Mayavi),并显示您当前如何尝试从 A 到 B。
  • @kwinkunks 首先我不认为它是完全相切的。问题仍然是关于数据的排序,因为我知道该情节适用于有序数据。接下来,我只能在 90 分钟内询问一次。

标签: python sorting numpy datagrid mayavi


【解决方案1】:

内置函数sorted 做你想做的事:

>>> a = [(1, 2, 1), (0, 8, 1), (1, 0, 0)]
>>> sorted(a)
[(0, 8, 1), (1, 0, 0), (1, 2, 1)]

【讨论】:

  • 谢谢。能否请您检查更新后的问题并提出您的建议。
【解决方案2】:

使用[sorted][1]

In [71]: sorted(a)
Out[71]: [(0, 8, 1), (1, 0, 0), (1, 2, 1)]

更准确

In [70]: sorted(a, key=lambda x: (x[0], x[1], x[2]))
Out[70]: [(0, 8, 1), (1, 0, 0), (1, 2, 1)]

key=lambda x: (x[0], x[1], x[2]) 在这一步我们是sortinglist0th1st2ndtuple的元素

【讨论】:

  • 您不需要提供key 函数,因为这是sorted() 默认执行的操作。
  • @martineau 试图更准确地讲述。
  • 谢谢。能否请您检查更新后的问题并提出您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-10
  • 2015-11-08
  • 2011-04-05
  • 1970-01-01
相关资源
最近更新 更多