Python NumPy数组:使用序列

时间:2017-05-26 08:44:06

标签: python arrays sorting numpy

我正在编写代码来处理结构化网格的CFD结果文件" .vtk" 我总是最终遇到这个问题:

  

" ValueError:使用序列"

设置数组元素

当我尝试重新排序代码正在读取的所有数据时出现问题:

    # Get nodes list and clean the extra nodes
    nodes_list = vtk_to_numpy(nodes_obj).tolist() #nodes = nodo de las mallas
    vof_list = vtk_to_numpy(vof_obj).tolist()
    to_sort = [tuple(nodes_list[x] + [vof_list[x]])  for x in range(len(nodes_list))]
    vof_list = None
    nodes_list = None
    ll = []
    for i in range(len(to_sort)): # What are we doing?
        ll.append(str(to_sort[i]))
    ll = list(set(ll))
    to_sort = []
    for i in range(len(ll)):
        to_sort.append(eval(ll[i]))


    # Set the type for each column
    dtype = [('x', float), ('y', float), ('z', float), ('vof', float)]
    to_sort = np.array(to_sort, dtype = dtype)

    ## Orders the Matrix according to X, Y, Z
    to_sort.sort(order = ('x', 'y', 'z'))

具体来说,问题出现在这一点上:

    # Set the type for each column
    dtype = [('x', float), ('y', float), ('z', float), ('vof', float)]
    to_sort = np.array(to_sort, dtype = dtype)

我试图将dtype从float更改为object,但这会使函数进入一个巨大的无限循环。

我该怎么办?

' to_sort',就在错误之前是一个如下所示的列表:

   [[(0.26602, 0.0011719, 0.0011719, [-4.5626e-06, -0.00012627, -0.00012222])],
   [(1.6254, 0.0011719, 0.0011719, [1.4921e-05, -0.00037639, -0.00037658])],
     ....
     ...
   [(2.2793, 0.0011719, 0.0011719, [5.2438e-06, 8.4728e-05, 8.4849e-05])]]

2 个答案:

答案 0 :(得分:3)

问题是你正在尝试创建一个结构化数组,但是传递一个列表列表。然后它尝试将该列表(一个序列)设置为一个元素,然后失败。相反,您需要一个元组列表。 From the docs:

  

如果你逐行填写它,它需要一个元组(但不是一个列表   或数组!):

所以试试快速修复:

to_sort = np.array(map(tuple, to_sort), dtype=dtype)

答案 1 :(得分:0)

alist = [[(0.26602, 0.0011719, 0.0011719, [-4.5626e-06, -0.00012627, -0.00012222])],

[(1.6254,0.0011719,0.0011719,[1.4921e-05,-0.00037639,-0.00037658])]]

使用这个化合物dtype:

In [39]: np.array(alist, dtype=('f,f,f,3f'))
Out[39]: 
array([[ ( 0.26602   ,  0.0011719,  0.0011719, [ -4.56260022e-06,  -1.26269995e-04,  -1.22219994e-04])],
       [ ( 1.62539995,  0.0011719,  0.0011719, [  1.49210000e-05,  -3.76390002e-04,  -3.76579992e-04])]], 
      dtype=[('f0', '<f4'), ('f1', '<f4'), ('f2', '<f4'), ('f3', '<f4', (3,))])

即,有4个字段,3个是浮点数,1个包含3个浮点数。结果是(n,1)数组。

有2个级别的[]产生2d阵列形状。定义记录的1级()。但在其中还有另一个[],在记录中定义一个数组。

并更改字段名称

In [41]: data =__
In [42]: data.dtype.names
Out[42]: ('f0', 'f1', 'f2', 'f3')
In [43]: data.dtype.names=['x','y','z','vof']
In [44]: data
Out[44]: 
array([[ ( 0.26602   ,  0.0011719,  0.0011719, [ -4.56260022e-06,  -1.26269995e-04,  -1.22219994e-04])],
       [ ( 1.62539995,  0.0011719,  0.0011719, [  1.49210000e-05,  -3.76390002e-04,  -3.76579992e-04])]], 
      dtype=[('x', '<f4'), ('y', '<f4'), ('z', '<f4'), ('vof', '<f4', (3,))])

或者

dt = np.dtype([('x', float), ('y', float), ('z', float), ('vof', float, 3)])
In [53]: data['vof'].shape
Out[53]: (2, 1, 3)
In [54]: data['x'].shape
Out[54]: (2, 1)

如果那不是您想要的dtype,则必须检查构建to_sort的方式。