【问题标题】:join numpy string arrays with delimiter使用分隔符连接 numpy 字符串数组
【发布时间】:2020-07-27 16:13:15
【问题描述】:

第一个问题:我有 2 个 numpy 整数数组。我想创建一个格式化为“%03d_%04d”的字符串的numpy数组。例如,当我使用

arr1 = np.arange(10)
arr2 = arr1**2
strarr1 = np.char.mod("%03d",arr1)
strarr2 = np.char.mod("%04d",arr2)
strarr = strarr1 + '_' + strarr2 

我得到

UFuncTypeError: ufunc 'add' did not contain a loop with signature 
matching types (dtype('<U3'), dtype('<U3')) -> dtype('<U3')

如何加入两个字符串数组 strarr1 和 strarr2?我怎样才能用“_”作为两个字符串之间的分隔符加入它们?

更一般的问题:我有一个形状为 (10000,3) 的 2D numpy 整数数组。创建格式为“%04d_%03d_%02d”的 numpy 字符串数组的简单方法是什么?

【问题讨论】:

    标签: arrays string numpy format


    【解决方案1】:
    In [84]: strarr1                                                                                       
    Out[84]: 
    array(['000', '001', '002', '003', '004', '005', '006', '007', '008',
           '009'], dtype='<U3')
    In [85]: strarr2                                                                                       
    Out[85]: 
    array(['0000', '0001', '0004', '0009', '0016', '0025', '0036', '0049',
           '0064', '0081'], dtype='<U4')
    

    numpy 没有为字符串 dtypes 实现 +。但是列表理解做得很好(使用python字符串添加):

    In [86]: [i+j for i,j in zip(strarr1, strarr2)]   
    

    或包含“_”

    In [88]: ['_'.join([i,j]) for i,j in zip(strarr1, strarr2)]                                            
    Out[88]: 
    ['000_0000',
     '001_0001',
     '002_0004',
     '003_0009',
     '004_0016',
     '005_0025',
     '006_0036',
     '007_0049',
     '008_0064',
     '009_0081']
    In [89]: np.array(_)                                                                                   
    Out[89]: 
    array(['000_0000', '001_0001', '002_0004', '003_0009', '004_0016',
           '005_0025', '006_0036', '007_0049', '008_0064', '009_0081'],
          dtype='<U8')
    

    使用 Python 字符串添加的另一种方法是“下拉到”对象 dtype:

    In [91]: strarr1.astype(object)+'_'+strarr2.astype(object)                                             
    Out[91]: 
    array(['000_0000', '001_0001', '002_0004', '003_0009', '004_0016',
           '005_0025', '006_0036', '007_0049', '008_0064', '009_0081'],
          dtype=object)
    

    作为一般规则,numpy 字符串 dtype 相对于 python 字符串列表提供的优势很少(如果有的话)。

    【讨论】:

    • 感谢 hpaulj 非常有用的回复!
    【解决方案2】:

    作为补充,Pandas 的方法是这样的:

    import pandas as pd
    import numpy as np
    
    df=pd.DataFrame({'A':np.arange(10),
                     'B':np.arange(10)**2})
    df['C']=df['A'].apply(str)+"_"+df['B'].apply(str)
    

    这给了

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 2010-10-09
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 2022-01-22
      • 1970-01-01
      • 2015-09-26
      • 2023-03-20
      相关资源
      最近更新 更多