Thank you very much.  Very detailed explanation.<br><br><div class="gmail_quote">On Thu, Mar 22, 2012 at 1:16 AM, Travis Oliphant <span dir="ltr">&lt;<a href="mailto:travis@continuum.io">travis@continuum.io</a>&gt;</span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word"><br><div><div class="im"><div>On Mar 21, 2012, at 11:48 PM, Yan Tang wrote:</div><br>
<blockquote type="cite"><span>Hi,</span><div><br></div><div>I am really confused on the np array or record array, and cannot understand how it works.</div><div><br></div><div>What I want to do is that I have a normal python two dimensional array/list:</div>

<div><br></div><div>a = [[&#39;2000-01-01&#39;, 2],[&#39;2000-01-02&#39;, 3]]</div><div><br></div><div>I want to convert it to a recarray with this dtype [(&#39;date&#39;, &#39;object&#39;), (&#39;count&#39;, &#39;int&#39;)].  I tried multiple ways and none of them works.  And some of the tests show pretty odd behavior.</div>

<div><br></div><div>This is good, and it is almost what i want:</div><div><br></div><div>&gt;&gt;&gt; import numpy as np</div><div>&gt;&gt;&gt; a = [(&#39;2000-01-01&#39;, 2), (&#39;2000-01-02&#39;, 3)]</div>
<div>&gt;&gt;&gt; np.array(a, dtype=[(&#39;date&#39;, &#39;object&#39;), (&#39;count&#39;, &#39;int&#39;)])</div><div><div>array([(&#39;2000-01-01&#39;, 2), (&#39;2000-01-02&#39;, 3)], </div><div>      dtype=[(&#39;date&#39;, &#39;|O8&#39;), (&#39;count&#39;, &#39;&lt;i8&#39;)])</div>
</div></blockquote><div><br></div></div><div>This is the correct way to initiate the record array, or structured array, from a Python object.   </div><div class="im"><br><blockquote type="cite"><div>
</div><div><br></div><div>Why this doesn&#39;t work?!</div><div><br></div><div><div>&gt;&gt;&gt; a = [[&#39;2000-01-01&#39;, 2],[&#39;2000-01-02&#39;, 3]]</div><div>&gt;&gt;&gt; np.array(a, dtype=[(&#39;date&#39;, &#39;object&#39;), (&#39;count&#39;, &#39;int&#39;)])</div>

<div>Traceback (most recent call last):</div><div>  File &quot;&lt;stdin&gt;&quot;, line 1, in &lt;module&gt;</div><div>ValueError: tried to set void-array with object members using buffer.</div><div><br></div></div></blockquote>
<div><br></div></div><div>The error here could be more instructive, but the problems is that to simplify the np.array factory function (which is already somewhat complex) it was decided to force records to be input as &quot;tuples&quot; and not as lists.   You *must* use tuples to specify records for a structured array.   </div>
<div class="im"><br><blockquote type="cite"><div><div>Why can this cause segmentation fault?!</div>
<div><br></div><div>&gt;&gt;&gt; a = [[&#39;2000-01-01&#39;, 2],[&#39;2000-01-02&#39;, 3]]</div><div><div>&gt;&gt;&gt; np.ndarray((len(a),), buffer=np.array(a), dtype=[(&#39;date&#39;, &#39;object&#39;), (&#39;count&#39;, &#39;int&#39;)])</div>

<div>Segmentation fault (And python quit!)</div></div></div></blockquote><div><br></div></div><div>The np.ndarray constructor should not be used directly unless you know what you are doing.</div><div><br></div><div>The np.array factory function is the standard way to create arrays.   The problem here is that you are explicitly asking NumPy to point to a particular region of memory to use as it&#39;s data-buffer.   This memory is the data buffer of an array of &quot;strings&quot;.   The np.array factory function will try and auto-detect the data-type of the array if you do not specify it --- which in this case results in an array of strings.    Then, with the dtype specification you are asking it to interpret a portion of that array of strings as a pointer to a Python object.   This will cause a segmentation fault when the printing code tries to dereference a pointer which is actually 4 characters of a string. </div>
<div><br></div><div>This should probably be checked for in the ndarray constructor.   I don&#39;t think it ever really makes sense to use an &quot;object&quot; dtype when you also supply the buffer unless that buffer actually held Python object pointers in the first place.   Even in this case you could do what you wanted without calling the constructor.  So, likely a check should be made so that you can&#39;t have an object array and also supply a buffer. </div>
<div class="im"><br><blockquote type="cite"><div><div><br></div><div>Python version 2.6.5</div></div><div><br></div><div>On this reference page, <a href="http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html" style="color:rgb(17,85,204)" target="_blank">http://docs.scipy.org/doc/numpy/reference/generated/numpy.array.html</a></div>

<div><br></div><div><div>&gt;&gt;&gt; x = np.array([(1,2),(3,4)])</div><div>&gt;&gt;&gt; x</div><div>array([[1, 2],</div><div>       [3, 4]])</div><div>&gt;&gt;&gt; np.array([[1, 2], [3, 4]])</div><div>array([[1, 2],</div>

<div>       [3, 4]])</div></div><div><br></div><div>Can anyone help me about this?</div></blockquote><div><br></div></div><div>I&#39;m not sure what you are asking for here?   Yes, for arrays with non-structured dtypes, numpy will treat tuples as lists. </div>
</div></div></blockquote><div><br></div><div>The thing I am asking for is, it looks like from my example, [[1,2],[3,4]], and [(1,2),(3,4)], after constructing the np.array, the result looks the same.  Then go back to my first question, why it looks like only the tuple works, not the list one.</div>
<div><br></div><div>As you explained, it looks like we have to use tuple instead of list.  That&#39;s OK.  But I didn&#39;t find it any place in the document, ;).</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div><div><br></div><div>Best regards,</div><div><br></div><div>-Travis</div><div><br></div><br><blockquote type="cite"><div><br></div><div>Thanks.</div>
_______________________________________________<br>NumPy-Discussion mailing list<br><a href="mailto:NumPy-Discussion@scipy.org" target="_blank">NumPy-Discussion@scipy.org</a><br><a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
</blockquote></div><br></div><br>_______________________________________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@scipy.org">NumPy-Discussion@scipy.org</a><br>
<a href="http://mail.scipy.org/mailman/listinfo/numpy-discussion" target="_blank">http://mail.scipy.org/mailman/listinfo/numpy-discussion</a><br>
<br></blockquote></div><br>