Nice programing

임의 길이 문자열의 numpy 배열을 만드는 방법은 무엇입니까?

nicepro 2020. 12. 29. 08:24
반응형

임의 길이 문자열의 numpy 배열을 만드는 방법은 무엇입니까?


저는 파이썬에 대한 완전한 신인이지만 주어진 문자열이 (효과적으로) 임의의 길이가 될 수있는 것 같습니다. 즉, a를 가져 와서 string str계속 추가 할 수 있습니다 str += "some stuff...".. 그러한 문자열의 배열을 만드는 방법이 있습니까?

이것을 시도하면 각 요소는 단일 문자 만 저장합니다.

strArr = numpy.empty(10, dtype='string')
for i in range(0,10)
    strArr[i] = "test"

반면에 특정 길이 문자열의 배열을 초기화 할 수 있다는 것을 알고 있습니다.

strArr = numpy.empty(10, dtype='s256')

최대 256 자의 문자열 10 개를 저장할 수 있습니다.


배열을 생성하여 그렇게 할 수 있습니다 dtype=object. 긴 문자열을 일반 numpy 배열에 할당하려고하면 문자열이 잘립니다.

>>> a = numpy.array(['apples', 'foobar', 'cowboy'])
>>> a[2] = 'bananas'
>>> a
array(['apples', 'foobar', 'banana'], 
      dtype='|S6')

그러나를 사용 dtype=object하면 파이썬 객체 참조 배열을 얻습니다. 따라서 파이썬 문자열의 모든 동작을 가질 수 있습니다.

>>> a = numpy.array(['apples', 'foobar', 'cowboy'], dtype=object)
>>> a
array([apples, foobar, cowboy], dtype=object)
>>> a[2] = 'bananas'
>>> a
array([apples, foobar, bananas], dtype=object)

실제로 객체의 배열이기 때문에 모든 종류의 파이썬 객체를 배열에 할당 할 수 있습니다 .

>>> a[2] = {1:2, 3:4}
>>> a
array([apples, foobar, {1: 2, 3: 4}], dtype=object)

그러나 이것은 numpy 사용의 많은 이점을 취소합니다. numpy는 원시 메모리의 큰 연속 블록에서 작동하기 때문에 매우 빠릅니다. 파이썬 객체로 작업하면 많은 오버 헤드가 추가됩니다. 간단한 예 :

>>> a = numpy.array(['abba' for _ in range(10000)])
>>> b = numpy.array(['abba' for _ in range(10000)], dtype=object)
>>> %timeit a.copy()
100000 loops, best of 3: 2.51 us per loop
>>> %timeit b.copy()
10000 loops, best of 3: 48.4 us per loop

개체 데이터 유형을 사용할 수 있습니다.

>>> import numpy
>>> s = numpy.array(['a', 'b', 'dude'], dtype='object')
>>> s[0] += 'bcdef'
>>> s
array([abcdef, b, dude], dtype=object)

참조 URL : https://stackoverflow.com/questions/14639496/how-to-create-a-numpy-array-of-arbitrary-length-strings

반응형