Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Numpy(字符、浮点和整数)读取混合类型二进制数据_Python_Numpy - Fatal编程技术网

Python 使用Numpy(字符、浮点和整数)读取混合类型二进制数据

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

我正在尝试将混合类型(不同数据结构)的二进制文件读入NumPy数组

数据组织在*.dat文件和*.dict(包含数据字典的纯文本)中。我拥有的数据字典示例如下:

“名称”“s”“50”
“项目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创建的是一个记录数组(或结构化数组)。