【问题标题】:how to use split() on python numpy.bytes_ type? (read dictionary from file)如何在 python numpy.bytes_ 类型上使用 split()? (从文件中读取字典)
【发布时间】:2013-07-30 17:49:56
【问题描述】:

我想将一个(非常大的、空格分隔的、两列的)文本文件中的数据读入 Python 字典。我尝试使用 for 循环来做到这一点,但这太慢了。更快的是使用 numpy loadtxt 将其读取到结构数组中,然后将其转换为字典:

data = np.loadtxt('filename.txt', dtype=[('field1', 'a20'), ('field2', int)], ndmin=1)
result = dict(data)

但这肯定不是最好的方法吗?有什么建议吗?

我需要其他东西的主要原因是以下不起作用:

data[0]['field1'].split(sep='-')

导致报错信息:

TypeError: Type str doesn't support the buffer API

如果 split() 方法存在,为什么我不能使用它?我应该使用不同的 dtype 吗?还是有不同的(快速)方式来读取文本文件?我还有什么遗漏的吗?

版本: 蟒蛇版本 3.3.2 numpy 版本 1.7.1

编辑:data['field1'].split(sep='-') 更改为data[0]['field1'].split(sep='-')

【问题讨论】:

  • 这些天我将不得不尝试理解 unicode... 顺便说一句,正确的做法是将答案写为正确的答案并接受它,而不是包含它在你的问题中。
  • 好的,完成()。再次感谢。

标签: python dictionary numpy split


【解决方案1】:

标准库split 返回可变数量的参数,具体取决于在字符串中找到分隔符的次数,因此不太适合数组操作。顺便说一句,我的 char numpy 数组(我正在运行 1.7)没有split 方法。

您确实有np.core.defchararray.partition,它与np.core.defchararray.partition 相似,但对矢量化没有任何问题,还有all the other string operations

>>> a = np.array(['a - b', 'c - d', 'e - f'], dtype=np.string_)
>>> a
array(['a - b', 'c - d', 'e - f'], 
      dtype='|S5')
>>> np.core.defchararray.partition(a, '-')
array([['a ', '-', ' b'],
       ['c ', '-', ' d'],
       ['e ', '-', ' f']], 
      dtype='|S2')

【讨论】:

  • 感谢您的回答 Jaime。我的意思是data**[0]**['field1'].split(sep='-'),而不是data['field1'].split(sep='-') ,尽管后者如果存在并且速度很快就会很棒。我相应地编辑了我上面的帖子。
  • 用我编的例子我可以运行a[0].split('-'),它应该等同于data['field1'][0].split(sep='-'),所以颠倒你的索引的顺序。您希望字符串中有多少个-
  • 用你的例子我得到:>>> np.core.defchararray.partition(a, '-') Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python3.3/site-packages/numpy/core/defchararray.py", line 1090, in partition _vec_string(a, object_, 'partition', (sep,))) TypeError: expected bytes, bytearray or buffer compatible object
  • 然后使用partition,一次调用即可拆分所有字符串。
  • 其实b'a-b'.split(b'-')就可以了。
【解决方案2】:

因为: type(data[0]['field1'])<class 'numpy.bytes_'>split() 方法在它有一个“普通”字符串作为参数时不起作用(这是一个错误吗?)

我解决它的方式: data[0]['field1'].split(sep=b'-') (关键是把b放在'-'前面)

当然,Jaime 使用以下内容的建议非常有帮助: np.core.defchararray.partition(a, '-') 但在这种情况下,也需要b'-' 才能使其工作。

事实上,这里已经回答了一个相关问题:Type str doesn't support the buffer API 虽然乍一看我并没有意识到这是同一个问题。

【讨论】:

    猜你喜欢
    • 2015-04-07
    • 2014-08-31
    • 2015-02-23
    • 2021-05-14
    • 1970-01-01
    • 2018-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-26
    相关资源
    最近更新 更多