eval函数在numpy数组中的应用

eval函数在numpy数组中的应用,numpy,Numpy,我的数据文件以列分隔 0 0 0 0.00 0.00 0.00 x1 y1 z1 0 0 0 0.75 0.75 0.00 -x1 -y1 z1 我想读这个文件,用numpy数组做一些列操作。这里,x1、y1、z1是程序中定义的变量。所以我的代码是 import numpy as np x1,y1,z1=0.5,0.5,0.5 data=np.genfromtxt("./inputfile",dtype=str) coordinate=d

我的数据文件以列分隔

0   0   0   0.00   0.00   0.00   x1  y1  z1
0   0   0   0.75   0.75   0.00   -x1  -y1  z1
我想读这个文件,用numpy数组做一些列操作。这里,x1、y1、z1是程序中定义的变量。所以我的代码是

import numpy as np
x1,y1,z1=0.5,0.5,0.5
data=np.genfromtxt("./inputfile",dtype=str)
coordinate=data[:,0]+data[:,6]
但是发生了错误

File "/home/hermite/Codes/spinel.py", line 4, in <module>
TypeError: unsupported operand type(s) for +: 'numpy.ndarray' and 'numpy.ndarray'
文件“/home/hermite/code/spinel.py”,第4行,在
TypeError:不支持+:'numpy.ndarray'和'numpy.ndarray'的操作数类型
我理解为什么会发生此错误,因为对于字符串数据类型,+操作是不允许的。因此,我必须将数据数组更改为数字。 我尝试了eval()函数,但这不适用于numpy数组。。所以我的问题是,如何将eval()函数应用于numpy数组?

试试:
data[:,0].astype(np.double)


仅供参考,一般来说,在内存中留下这样的字符串不是一个好主意。至少考虑使用NUMPY结构数组,并且可能只使用x y z列的系数,这样就可以将它们存储为内存中的整数/双倍。

这是一系列操作,将将您的示例文本转换为2D编号数组,在该过程中填充X1、Y1、Z1的值。这些是ipython会话中的行

通过剪切和粘贴文本模拟从文件读取

In [109]: txt=b"""0   0   0   0.00   0.00   0.00   x1  y1  z1
0   0   0   0.75   0.75   0.00   -x1  -y1  z1"""    
In [110]: txt=txt.splitlines()
genfromtxt
为每列指定数据类型。结果是一个混合了int、float和string列(或字段)的结构化数组:

我通过字段名访问字段,并使用
eval
逐个转换字符串值

要将整个数组转换为二维数字数组,请创建一个空数组来保存转换后的数据

In [113]: data1=np.zeros((2,9),float)
用简单副本填写数字列:

In [114]: for i in range(6):
    data1[:,i]=data[data.dtype.names[i]]
   .....:     
 # or `data1[:,:6]=data[list(data.dtype.names[:6])].tolist()` 
对于字符串列,分别通过
eval
传递值:

In [115]: x1,y1,z1=.25,.5,.75    
In [116]: for i in range(6,9):
    data1[:,i]=[eval(a) for a in data[data.dtype.names[i]]]
   .....:     
结果数据:

In [117]: data1
Out[117]: 
array([[ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.25,  0.5 ,  0.75],
       [ 0.  ,  0.  ,  0.  ,  0.75,  0.75,  0.  , -0.25, -0.5 ,  0.75]])

eval(a)
可以被一个更安全的函数代替,例如,一个只解释可接受字符串的函数,如
x1

如果指定
dtype=None
,那么
数据
看起来是什么样子?如果我退出
打印数据
打印数据.dtype.type
,那么它会显示
(0,0,0,0.0,0.0,0.0,'x1','y1','z1')
这将处理前6列,可以将其解析为浮点,但不处理3个符号列。如果可以在电子表格中将固定多项式编码为系数,则可以处理符号列。Eval将非常缓慢,通常人们会抱怨从文件中提取时的安全性,而这不应阻止您。你的意思是,不是把
-x1 y1-z1
放在文件中,而是把
-11-1
放在文件中?也许他用
-x1
来提高人的可读性。
eval
可以用一个更安全的函数来代替。是的,但是对于人的可读性来说,如果变量总是相同的话,它与其他列相比没有多大的好处如果你考虑到真正的符号求值的麻烦,那么如果他使用的是一个固定的多项式,这似乎是不合理的。求值仍然很慢,而且是一件非常小心使用的武器。谢谢。但是为什么你在[137]:坐标=数据['f0']+[eval(a)表示数据中的a['f6']]中用[]来包装求值函数呢?我刚刚尝试省略[]并对一个in-data['f6']执行
eval(a),但出现了错误。用[]包装它,这样
[eval(a)for a in-data['f6']]
就不会出错。原因是什么?
[eval(a)for a in…]
是一种列表理解,一种Python循环或映射。它计算
eval(a)
,并将结果作为列表返回。
In [115]: x1,y1,z1=.25,.5,.75    
In [116]: for i in range(6,9):
    data1[:,i]=[eval(a) for a in data[data.dtype.names[i]]]
   .....:     
In [117]: data1
Out[117]: 
array([[ 0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.25,  0.5 ,  0.75],
       [ 0.  ,  0.  ,  0.  ,  0.75,  0.75,  0.  , -0.25, -0.5 ,  0.75]])