【问题标题】:numpy array of strings indexing behavior字符串索引行为的numpy数组
【发布时间】:2013-09-17 06:01:51
【问题描述】:

我有一个字符串数组

>>> lines
array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223', ...,
       'RL5\\Stark_238', 'RL5\\Stark_238', 'RL5\\Stark_238'], 
      dtype='|S27')

为什么我可以索引到第一个数组元素的字符串

>>> lines[0][0:3]
'RL5'

但不是所有数组元素都放在同一个地方

>>> lines[:][0:3]
array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223'], 
      dtype='|S27')

谁能建议一种方法来获得以下结果:

array(['RL5', 'RL5', 'RL5', ...'RL5', 'RL5')

【问题讨论】:

    标签: python arrays string numpy indexing


    【解决方案1】:

    要提取每个字符串的前n 字符,您可以滥用.astype

    >>> s = np.array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223'])
    >>> s
    array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223'], 
          dtype='|S13')
    >>> s.astype('|S3')
    array(['RL5', 'RL5', 'RL5'], 
          dtype='|S3')
    

    【讨论】:

    • 不知道为什么这个答案这么难找!简单明了——谢谢!
    【解决方案2】:

    不要忘记字符数组!

    lines.view(np.chararray).ljust(3)
    chararray(['RL5', 'RL5', 'RL5', 'RL5', 'RL5', 'RL5'], 
          dtype='|S3')
    

    虽然速度慢得奇怪:

    #Extend lines to 600000 elements
    
    %timeit lines.view(np.chararray).ljust(3)
    1 loops, best of 3: 542 ms per loop
    
    %timeit np.vectorize(lambda x: x[:3])(lines)
    1 loops, best of 3: 239 ms per loop
    
    %timeit map(lambda s: s[0:3], lines)
    1 loops, best of 3: 243 ms per loop
    
    %timeit arr.astype('|S3')
    100 loops, best of 3: 4.72 ms per loop
    

    可能是因为它复制了数据,这样做的好处是输出数组的 dtype 被最小化:S3 vs S64

    【讨论】:

      【解决方案3】:

      试试这个

      map(lambda s:s[0:3],lines)
      

      【讨论】:

        【解决方案4】:

        你可以使用numpy的vectorize:

        In [11]: np.vectorize(lambda x: x[:3])(lines)
        Out[11]: 
        array(['RL5', 'RL5', 'RL5', 'RL5', 'RL5', 'RL5'], 
              dtype='|S64')
        

        【讨论】:

          【解决方案5】:

          如果您正在寻找快速且(更)灵活的产品,请尝试:

          lines.view('|S1').reshape(-1, lines.dtype.itemsize)[:, :3].reshape(-1).view('|S3')
          

          可用于更任意的切片和切块。

          时间信息:

          import numpy as np
          lines = np.array(['RL5\\Stark_223', 'RL5\\Stark_223', 'RL5\\Stark_223', 
          'RL5\\Stark_238', 'RL5\\Stark_238', 'RL5\\Stark_238'], dtype='|S27').repeat(100000)
          
          %timeit lines.view(np.chararray).ljust(3)
          1 loop, best of 3: 231 ms per loop
          
          %timeit np.vectorize(lambda x: x[:3])(lines)
          1 loop, best of 3: 226 ms per loop
          
          %timeit map(lambda s: s[0:3], lines)
          1 loop, best of 3: 171 ms per loop
          
          %timeit lines.astype('|S3')
          100 loops, best of 3: 3.58 ms per loop
          
          %timeit lines.view('|S1').reshape(-1, lines.dtype.itemsize)[:, :3].reshape(-1).view('|S3')
          100 loops, best of 3: 5.16 ms per loop
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-05-05
            • 1970-01-01
            • 1970-01-01
            • 2015-12-30
            相关资源
            最近更新 更多