我正在编写代码来处理结构化网格的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])]]
答案 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
的方式。