How to create a numpy array of arbitrary length strings?

后端 未结 2 1022
死守一世寂寞
死守一世寂寞 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: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
    

提交回复
热议问题