Python 使用Numpy(字符、浮点和整数)读取混合类型二进制数据
我正在尝试将混合类型(不同数据结构)的二进制文件读入NumPy数组 数据组织在*.dat文件和*.dict(包含数据字典的纯文本)中。我拥有的数据字典示例如下: “名称”“s”“50”Python 使用Numpy(字符、浮点和整数)读取混合类型二进制数据,python,numpy,Python,Numpy,我正在尝试将混合类型(不同数据结构)的二进制文件读入NumPy数组 数据组织在*.dat文件和*.dict(包含数据字典的纯文本)中。我拥有的数据字典示例如下: “名称”“s”“50” “项目ID”“i”“4” 金额“f”8 然后,我的想法是创建一个类,通过调用该类实例化并加载数据 f = data_bin() f.load("profit.bin") 每当我有整数和浮点的组合时,这个代码就完美无瑕地工作了,但是当我在中间抛出一个字符串字段时,它就把我的错误抛给了BR> . TypeError
“项目ID”“i”“4”
金额“f”8 然后,我的想法是创建一个类,通过调用该类实例化并加载数据
f = data_bin()
f.load("profit.bin")
每当我有整数和浮点的组合时,这个代码就完美无瑕地工作了,但是当我在中间抛出一个字符串字段时,它就把我的错误抛给了BR>
.
TypeError:需要浮点参数,而不是numpy.string
作为旁注,我可以说我真的需要Numpy中的数据(出于性能和与现有代码兼容的原因),但我可以接受类似python列表的东西,并从那里转到Numpy 我非常感谢你的帮助
class data_bin:
def __init__(self):
self.datafile="No file loaded yet"
self.dictfile="No file loaded yet"
self.dictionary=None
self.data=None
def load(self, file):
self.datafile = file
self.dictfile=file[0:len(file)-3]+"dict"
self.builds_dt()
self.loads_data()
def builds_dt(self):
w=open(self.dictfile,'rb')
w.readline()
w.readline()
q=w.readline()
dt=[]
while len(q)>0:
a=q.rstrip().split(',')
field_name=a[0]
field_type=a[1]
field_length=a[2]
dt.append((field_name,field_type+field_length))
q=w.readline()
self.dictionary=dt
def loads_data(self):
f=open(self.datafile,'rb')
self.data=np.fromfile(f, dtype=self.dictionary)
def info(self):
print "Binnary Source: ", self.datafile
print " Data Types:", self.dictionary
try:
print " Number of records: ", self.data.shape[0]
except:
print " No valid data loaded"
如果您确实希望将所有数据按行存储在numpy数组中,则可以。例如:
myArr = np.array([1, 2.5, 'hello', {'a':7}], dtype='O')
--> array([1, 2.5, 'hello', {'a': 7}], dtype=object)
这将创建一个numpy对象数组。因为Python中的所有东西都是对象,所以它可以工作。不幸的是,您首先失去了很多使用numpy阵列的理由。如果您需要对数据执行计算,我建议按数据类型将它们分开,并从中开始工作(例如,基于第2列进行解析,或者使用np.where与np.take和np.loadtxt中的recarray组合使用)。否则,我建议坚持使用python列表或类似的东西
尽管如此,一些功能仍然有效:
e.g.,
myArr = np.append(myArr, ('what?', 5.2))
--> array([1, 2.5, 'hello', {'a': 7}, 'what?', '5.2'], dtype=object)
myArr.reshape(2,3)
--> array([[1, 2.5, 'hello'],
[{'a': 7}, 'what?', '5.2']], dtype=object)
如果我错过了一些关于你想要的东西,请告诉我 不能在一个numpy数组中混合数据类型。它与numpy数组的定义方式有根本的冲突。Pandas可能会工作,也可能是结构化数组。@M4rtini,我的想法是使用结构化数组,我实际上认为Numpy是在结构化(也称为记录数组)中加载数据,我认为这样可以使用字符串(由于它允许我拥有不同的数据类型,如整数和浮点,我确实需要执行计算,因此需要使用Numpy,其思想是读取数据库,执行计算(并修改它)然后将它写回一个包含字符串、浮点和整数的二进制文件中。你认为最好的方法是什么?事实证明,代码是有效的,正如@M4rtini所建议的,Numpy创建的是一个记录数组(或结构化数组)。