объединить numpy строковые массивы с разделителем - PullRequest
1 голос
/ 14 апреля 2020

1-й вопрос: У меня есть 2 numpy массива целых чисел. Я хотел бы создать массив строк numpy, отформатированный как "% 03d_% 04d". Например, когда я использую

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? И как я могу объединить их с "_" в качестве разделителя между двумя строками?

Более общий вопрос : у меня есть массив 2D numpy целых чисел формы (10000,3 ). Какой простой способ создать массив строк numpy в формате "% 04d_% 03d_% 02d"?

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

В качестве дополнения путь к go в 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)

, который дает

enter image description here

1 голос
/ 14 апреля 2020
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 строковые dtypes предлагают несколько, если вообще имеют, преимущества по сравнению со python списками строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...