Truly recursive `tolist()` for NumPy structured arrays
<p>From what I understand, the recommended way to convert a NumPy array into a native Python list is to use <a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.tolist.html" rel="nofollow"><code>ndarray.tolist</code></a>.</p>

<p>Alas, this doesn't seem to work recursively when using structured arrays. Indeed, some <code>ndarray</code> objects are being referenced in the resulting list, unconverted:</p>

<pre><code>&gt;&gt;&gt; dtype = numpy.dtype([('position', numpy.int32, 3)])
&gt;&gt;&gt; values = [([1, 2, 3],)]
&gt;&gt;&gt; a = numpy.array(values, dtype=dtype)
&gt;&gt;&gt; a.tolist()
[(array([1, 2, 3], dtype=int32),)]
</code></pre>

<p>I did write a simple function to workaround this issue:</p>

<pre><code>def array_to_list(array):
    if isinstance(array, numpy.ndarray):
        return array_to_list(array.tolist())
    elif isinstance(array, list):
        return [array_to_list(item) for item in array]
    elif isinstance(array, tuple):
        return tuple(array_to_list(item) for item in array)
    else:
        return array
</code></pre>

<p>Which, when used, provides the expected result:</p>

<pre><code>&gt;&gt;&gt; array_to_list(a) == values
True
</code></pre>

<p>The problem with this function is that it duplicates the job of <code>ndarray.tolist</code> by recreating each list/tuple that it outputs. Not optimal.</p>

<p>So the questions are:</p>

<ul>
<li>is this behaviour of <code>ndarray.tolist</code> to be expected?</li>
<li>is there a better way to make this happen?</li>
</ul>