2017-02-13 2 views
0

Для моего заявления, я могу объявить массив строк двумя способами:Объединение строк в списке Python (строк) по сравнению с NumPy массив (строк)

  1. В списке strArr1 = [""] * 5 или

  2. Как Numpy массив strArr2 = numpy.empty([5], dtype=str)

Однако, я вижу следующую разницу, когда я пытаюсь объединить символы элементов массива. В первом случае, например,

strArr1[0] += 'a' 
strArr1[0] += 'b' 

дает мне как ожидалось ['ab', '', '', '', ''].

Во втором случае, однако,

strArr2[0] += 'a' 
strArr2[0] += 'b' 

дает мне результат ['a', '', '', '', ''].

Почему конкатенация не работает как ожидалось для элементов массива numpy? Кроме того, учитывая, что у меня есть ограничение на то, что я должен расширять элементы моего массива по одному символу за раз, может ли кто-нибудь предложить эффективный и питонический подход?

Спасибо.

+0

Что еще вы делаете с этими списками или массивами? До сих пор я не вижу веских оснований использовать форму массива. – hpaulj

ответ

0
  1. Numpy требует строковых массивов с фиксированной максимальной длиной. Вы можете использовать strArr2 = numpy.empty([5], dtype='S10'), где 10 - это максимум строки, которую может хранить каждый элемент, более длинная подстрока будет усечена.

    Или strArr2 = numpy.empty([5], dtype=object), который позволит вам хранить произвольный объект python в массиве, включая string.

    См. Data type objects (dtype).

  2. Чтобы повысить эффективность расширения символов строки, вы можете попытаться использовать список Python в качестве типа данных, а затем append каждого нового символа в список. После того, как все символы завершены, используйте join для преобразования списка обратно в строку.

+0

Если я объявляю 'strArr2 = numpy.empty ([5], dtype = 'S10')', каждый элемент имеет тип 'numpy.bytes_', а затем я не могу объединить символы/str с этими элементами. –

+1

В Py3 попробуйте 'arr = np.zeros ((5,), dtype = 'U10')' - unicode является стандартным для py3. Или отметьте добавление в виде строки байта, например. 'arr [0] + = b'abc'' – hpaulj

+0

Это хорошо работает для меня (' Numpy 1.11.2 с Python 2.7.12') и 'type (strArr2 [0])' дает ' '.Во всяком случае, использование 'dtype = object' или метода 2 было бы более уместным. –

0

Декларирование numpy.empty с dtype='U10' работал, хотя и без маркировки моих дополнений, как байты, т.е. ж/о b'abc', которая выйдет из строя.

Наконец, ради эффективности, я последую за предложением Neo X, которое должно избегать определенных аномалий распределения в поведении.

P.S. Я использую Numpy 1.10.4 with Python 3.5.1.

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