2015-09-18 6 views
7

У меня есть 2-мерный массив строк. Есть ли способ объединить строки в каждой строке, а затем присоединить полученные строки с разделительной строкой, например. новинка?конкатенировать массив строк numpy вдоль оси?

Пример:

pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 

Я хочу получить:

"Hello\nWorld\n" 
+0

Является ли окончательный '\ n'' важный? Обычное использование 'join' помещает разделитель между строками, но не в конец. – hpaulj

+0

Это не важно - я всегда могу добавить его позже. – ErikR

ответ

7

Это не трудно сделать вне из NumPy:

>>> import numpy as np 
>>> pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 
>>> pic 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='|S1') 
>>> '\n'.join([''.join(row) for row in pic]) 
'Hello\nWorld' 

Существует также np.core.defchararray модуль, который имеет «лакомства» для работы с массивами символов. Однако, он утверждает, что это всего лишь обертки вокруг встроенных функций python и стандартных библиотек, поэтому вы, вероятно, не получите никакого реального ускорения, используя их.

2

Один из способов будет использовать str.join() и список понимание, пример -

In [1]: import numpy as np 

In [2]: pic = np.array([ 'H','e','l','l','o','W','o','r','l','d']).reshape(2,5) 

In [3]: pic 
Out[3]: 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='<U1') 

In [4]: '\n'.join([''.join(x) for x in pic]) 
Out[4]: 'Hello\nWorld' 

Если вам действительно нужно \n в конце концов, вы можете сцепить его после присоединения й строки. Пример:

In [5]: '\n'.join([''.join(x) for x in pic]) + '\n' 
Out[5]: 'Hello\nWorld\n' 
7

У вас были правильные идеи. Вот vectorized NumPythonic реализация пытается идти вдоль этих идей -

# Create a separator string of the same rows as input array 
separator_str = np.repeat(['\n'], pic.shape[0])[:,None] 

# Concatenate these two and convert to string for final output 
out = np.concatenate((pic,separator_str),axis=1).tostring() 

Или один вкладыш с np.column_stack -

np.column_stack((pic,np.repeat(['\n'], pic.shape[0])[:,None])).tostring() 

Пример запуска -

In [123]: pic 
Out[123]: 
array([['H', 'e', 'l', 'l', 'o'], 
     ['W', 'o', 'r', 'l', 'd']], 
     dtype='|S1') 

In [124]: np.column_stack((pic,np.repeat(['\n'], pic.shape[0])[:,None])).tostring() 
Out[124]: 'Hello\nWorld\n' 
+0

Это очень интересно. – ErikR

+0

@ user5402 Да! Я не ожидал иметь чисто numpythonic решение, но в итоге это получилось! :) – Divakar

+0

Это интересно. Я немного ленив, чтобы попробовать, но мне интересно, как тайминги будут сравниваться с другими (не-numpy) решениями. – mgilson

Смежные вопросы