按照网格在python中排序3d数组

时间:2015-11-21 19:37:12

标签: python sorting numpy datagrid mayavi

我在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

2 个答案:

答案 0 :(得分:3)

内置函数sorted可以满足您的需求:

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

答案 1 :(得分:1)

使用[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]) 在此步骤中,我们sorting list位于0th 1st2nd tuple元素