How to create a numpy array of arbitrary length strings?

后端 未结 2 996
死守一世寂寞
死守一世寂寞 2020-11-27 15:53

I\'m a complete rookie to Python, but it seems like a given string is able to be (effectively) arbitrary length. i.e. you can take a string str and keeping add

相关标签:
2条回答
  • 2020-11-27 16:24

    You could use the object data type:

    >>> import numpy
    >>> s = numpy.array(['a', 'b', 'dude'], dtype='object')
    >>> s[0] += 'bcdef'
    >>> s
    array([abcdef, b, dude], dtype=object)
    
    0 讨论(0)
  • 2020-11-27 16:28

    You can do so by creating an array of dtype=object. If you try to assign a long string to a normal numpy array, it truncates the string:

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

    But when you use dtype=object, you get an array of python object references. So you can have all the behaviors of python strings:

    >>> 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)
    

    Indeed, because it's an array of objects, you can assign any kind of python object to the array:

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

    However, this undoes a lot of the benefits of using numpy, which is so fast because it works on large contiguous blocks of raw memory. Working with python objects adds a lot of overhead. A simple example:

    >>> 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
    
    0 讨论(0)
提交回复
热议问题