【问题标题】:Numpy Array with Multiple dtypes not formatting correctly具有多个 dtype 的 Numpy 数组格式不正确
【发布时间】:2014-12-10 15:15:24
【问题描述】:

也许这是一个愚蠢的问题,但我以前从未见过这种行为,我不确定谷歌的正确术语!

如果我以这种方式加载我的数组:

A= np.loadtxt(csv,dtype='a100')

我得到了这种格式的东西(它是一个二维数组)。我习惯了这种格式,因为我知道它很快,而且我知道如何通过行和列轻松找到元素的索引。

[[a,1],[b,2]]

但是,因为我的数组同时包含字符串和浮点数,所以当我将数组加载进去时,我会得到不同的结果。

A= np.loadtxt(csv,dtype='a100,float')

结果:[(a,1),(b,2)]

我这里的目标是能够根据第一列的字符串快速搜索到数组,然后对第二列进行数值运算。

最好将它保存在一个可以让我索引 [[]] 的 dtype 中,然后以某种方式将该字符串转换为浮点数以进行数值运算,然后将其写回?

我是否仍可以使用组合 dtype 执行所有相同的搜索和索引,同时仍保持 numpy 的速度?

我是不是完全置身其中?

感谢您的任何意见。

【问题讨论】:

    标签: python python-3.x numpy


    【解决方案1】:

    numpy darrays 必须是同构的(也就是说,所有元素都必须具有相同的数据类型)。由于np,loadtxt() 发现不同的值类型,它假定您需要一个复杂数据类型的向量而不是二维数组。

    【讨论】:

    • 我明白了,我可以将我在同构数组中找到的东西转换为数字,执行操作然后将其作为字符串写回吗?你知道我可以用谷歌搜索更多信息吗?
    • 您可能需要更仔细地考虑您的要求。查看this page from the numpy docs 以了解有关字段访问的更多信息。我不会考虑将数字存储为字符串并进行转换。这将是非常低效的。
    • 那你会推荐什么?具有两种不同数据类型的两个不同数组?我需要一种快速的方法来搜索和索引相当大的数组。
    • Pandas 可以处理不同数据类型的列,所以如果 Oliver W 的建议不能满足您的需求,您可以考虑。
    【解决方案2】:

    您可以继续使用您生成的结构化数据类型。例如:

    $ cat data.csv
    a 1
    b 3 
    c 4
    d 5
    e 0
    f 8
    

    您可以根据第一列中的值对第二列执行操作:

    >>> data = np.loadtxt('data.csv', dtype='a100,int')
    >>> data.dtype
    dtype([('f0', 'S100'), ('f1', '<i8')])
    >>> data.dtype.names
    ('f0', 'f1')
    

    因为我没有为np.loadtxtdtype 参数中的列指定任何特定名称,numpy 会自动为列分配f0f1(来自“field0”和“field1”)。

    您现在可以使用基于这些字段名称的索引:

    >>> def some_processing(arr):  # example function to simulate some processing
    ...     return (arr < 'e') & (arr > 'b')
    ...
    >>> data['f1'][some_processing(data['f0'])]
    array([4, 5])
    

    这些结构化数组的工作方式类似于您习惯使用的典型 n 维数组,但它们是同质的(即所有元素都属于同一类型),但您不能将数字索引分组到同一组正方形中括号(所以没有data[:3,'f1'],但data[:3]['f1']data['f1'][:3] 很好)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-07
      • 2018-09-19
      • 2020-05-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多