<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jan 30, 2018 at 2:42 PM,  <span dir="ltr"><<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="gmail-h5">On Tue, Jan 30, 2018 at 1:33 PM,  <span dir="ltr"><<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote"><div><div class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-h5">On Tue, Jan 30, 2018 at 12:28 PM, Allan Haldane <span dir="ltr"><<a href="mailto:allanhaldane@gmail.com" target="_blank">allanhaldane@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 01/29/2018 11:50 PM, <a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
<br>
On Mon, Jan 29, 2018 at 10:44 PM, Allan Haldane <<a href="mailto:allanhaldane@gmail.com" target="_blank">allanhaldane@gmail.com</a> <mailto:<a href="mailto:allanhaldane@gmail.com" target="_blank">allanhaldane@gmail.com</a><wbr>>> wrote:<br>
<br>
    On 01/29/2018 05:59 PM, <a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><span class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-"><br>
    <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>> wrote:<br>
<br>
<br>
<br>
        On Mon, Jan 29, 2018 at 5:50 PM, <<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><br></span><span class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-">
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>> <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>>><wbr>> wrote:<br>
<br>
<br>
<br></span><span class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-">
             On Mon, Jan 29, 2018 at 4:11 PM, Allan Haldane<br>
             <<a href="mailto:allanhaldane@gmail.com" target="_blank">allanhaldane@gmail.com</a> <mailto:<a href="mailto:allanhaldane@gmail.com" target="_blank">allanhaldane@gmail.com</a><wbr>><br></span>
        <mailto:<a href="mailto:allanhaldane@gmail.com" target="_blank">allanhaldane@gmail.com</a> <mailto:<a href="mailto:allanhaldane@gmail.com" target="_blank">allanhaldane@gmail.com</a><wbr>>>><span class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-"><br>
        wrote:<br>
<br>
                 On 01/29/2018 04:02 PM, <a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>><br></span><span class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-">
                 <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>>> wrote:<br>
                 ><br>
                 ><br></span><div><div class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-h5">
                 > On Mon, Jan 29, 2018 at 3:44 PM, Benjamin Root<br>
        <<a href="mailto:ben.v.root@gmail.com" target="_blank">ben.v.root@gmail.com</a> <mailto:<a href="mailto:ben.v.root@gmail.com" target="_blank">ben.v.root@gmail.com</a>><br>
        <mailto:<a href="mailto:ben.v.root@gmail.com" target="_blank">ben.v.root@gmail.com</a> <mailto:<a href="mailto:ben.v.root@gmail.com" target="_blank">ben.v.root@gmail.com</a>>><br>
                 > <mailto:<a href="mailto:ben.v.root@gmail.com" target="_blank">ben.v.root@gmail.com</a><br>
        <mailto:<a href="mailto:ben.v.root@gmail.com" target="_blank">ben.v.root@gmail.com</a>> <mailto:<a href="mailto:ben.v.root@gmail.com" target="_blank">ben.v.root@gmail.com</a><br>
        <mailto:<a href="mailto:ben.v.root@gmail.com" target="_blank">ben.v.root@gmail.com</a>>><wbr>>> wrote:<br>
                 ><br>
                 >     I <3 structured arrays. I love the fact that I<br>
        can access data by<br>
                 >     row and then by fieldname, or vice versa. There<br>
        are times when I<br>
                 >     need to pass just a column into a function, and<br>
        there are times when<br>
                 >     I need to process things row by row. Yes, pandas<br>
        is nice if you want<br>
                 >     the specialized indexing features, but it becomes<br>
        a bear to deal<br>
                 >     with if all you want is normal indexing, or even<br>
        the ability to<br>
                 >     easily loop over the dataset.<br>
                 ><br>
                 ><br>
                 > I don't think there is a doubt that structured<br>
        arrays, arrays with<br>
                 > structured dtypes, are a useful container. The<br>
        question is whether they<br>
                 > should be more or the foundation for more.<br>
                 ><br>
                 > For example, computing a mean, or reduce operation,<br>
        over numeric element<br>
                 > ("columns"). Before padded views it was possible to<br>
        index by selecting<br>
                 > the relevant "columns" and view them as standard<br>
        array. With padded<br>
                 > views that breaks and AFAICS, there is no way in<br>
        numpy 1.14.0 to compute<br>
                 > a mean of some "columns". (I don't have numpy 1.14 to<br>
        try or find a<br>
                 > workaround, like maybe looping over all relevant<br>
        columns.)<br>
                 ><br>
                 > Josef<br>
<br>
                 Just to clarify, structured types have always had<br>
        padding bytes,<br>
                 that<br>
                 isn't new.<br>
<br>
                 What *is* new (which we are pushing to 1.15, I think)<br>
        is that it<br>
                 may be<br>
                 somewhat more common to end up with padding than<br>
        before, and<br>
                 only if you<br>
                 are specifically using multi-field indexing, which is a<br>
        fairly<br>
                 specialized case.<br>
<br>
                 I think recfunctions already account properly for<br>
        padding bytes.<br>
                 Except<br>
                 for the bug in #8100, which we will fix, padding-bytes in<br>
                 recarrays are<br>
                 more or less invisible to a non-expert who only cares about<br>
                 dataframe-like behavior.<br>
<br>
                 In other words, padding is no obstacle at all to<br>
        computing a<br>
                 mean over a<br>
                 column, and single-field indexes in 1.15 behave<br>
        identically as<br>
                 before.<br>
                 The only thing that will change in 1.15 is multi-field<br>
        indexing,<br>
                 and it<br>
                 has never been possible to compute a mean (or any binary<br>
                 operation) on<br>
                 multiple fields.<br>
<br>
<br>
             from the example in the other thread<br>
             a[['b', 'c']].view(('f8', 2)).mean(0)<br>
<br>
<br>
             (from the statsmodels usecase:<br>
             read csv with genfromtext to get recarray or structured array<br>
             select/index the numeric columns<br>
             view them as standard array<br>
             do whatever we can do with standard numpy  arrays<br>
             )<br>
<br>
<br>
    Oh ok, I misunderstood. I see your point: a mean over fields is more<br>
    difficult than before.<br>
<br>
        Or, to phrase it as a question:<br>
<br>
        How do we get a standard array with homogeneous dtype from the<br>
        corresponding elements of a structured dtype in numpy 1.14.0?<br>
<br>
        Josef<br>
<br>
<br>
    The answer may be that "numpy has never had a way to that",<br>
    even if in a few special cases you might hack a workaround using views.<br>
<br>
    That's what your example seems like to me. It uses an explicit view,<br>
    which is an "expert" feature since views depend on the exact memory<br>
    layout and binary representation of the array. Your example only<br>
    works if the two fields have exactly the same dtype as each other<br>
    and as the final dtype, and evidently breaks if there is byte<br>
    padding for any reason.<br>
<br>
    Pandas can do row means without these problems:<br>
<br>
         >>> pd.DataFrame(np.ones(10, dtype='i8,f8')).mean(axis=0)<br>
<br>
    Numpy is missing this functionality, so you or whoever wrote that<br>
    example figured out a fragile workaround using views.<br>
<br>
<br>
Once upon a time (*) this wasn't fragile but the only and recommended way. Because dtypes were low level with clear memory layout and stayed that way, it was easy to check item size or whatever and get different views on it.<br>
e.g. <a href="https://mail.scipy.org/pipermail/numpy-discussion/2008-December/039340.html" rel="noreferrer" target="_blank">https://mail.scipy.org/piperma<wbr>il/numpy-discussion/2008-Decem<wbr>ber/039340.html</a><br>
<br>
(*) pre-pandas, pre-stackoverflow on the mailing lists which was for me roughly 2008 to 2012<br>
but a late thread <a href="https://mail.scipy.org/pipermail/numpy-discussion/2015-October/074014.html" rel="noreferrer" target="_blank">https://mail.scipy.org/piperma<wbr>il/numpy-discussion/2015-Octob<wbr>er/074014.html</a><br>
"What is now the recommended way of converting structured dtypes/recarrays to ndarrays?"<br>
<br></div></div></blockquote></blockquote></div></div></div></div></div></blockquote><div><br></div></div></div><div>on final historical note  (once upon a time users relied on cookbooks)</div><div><a href="http://scipy-cookbook.readthedocs.io/items/Recarray.html#Converting-to-regular-arrays-and-reshaping" target="_blank">http://scipy-cookbook.readthed<wbr>ocs.io/items/Recarray.html#<wbr>Converting-to-regular-arrays-<wbr>and-reshaping</a></div><div>2010-03-09 (last modified), 2008-06-27 (created)<br></div><div>which I assume is broken in numpy 1.4.0</div></div></div></div></blockquote><div><br></div><div>and a final grumpy note</div><div><br></div><div><a href="https://docs.scipy.org/doc/numpy-1.14.0/release.html#multiple-field-indexing-assignment-of-structured-arrays">https://docs.scipy.org/doc/numpy-1.14.0/release.html#multiple-field-indexing-assignment-of-structured-arrays</a><br></div><div><br></div><div>"

<span style="color:rgb(51,51,51);font-family:"Open Sans",sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">which will affect code such as"    =  "which will break your code without offering an alternative"</span></div><div><span style="color:rgb(51,51,51);font-family:"Open Sans",sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="color:rgb(51,51,51);font-family:"Open Sans",sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><br></span></div><div><span style="color:rgb(51,51,51);font-family:"Open Sans",sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Josef</span></div><div><span style="color:rgb(51,51,51);font-family:"Open Sans",sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><back to regular scheduled topics></span></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="gmail-h5"><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><div class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-h5"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-h5">
<br>
<br>
<br>
    I suggest that if we want to allow either means over fields, or<br>
    conversion of a n-D structured array to an n+1-D regular ndarray, we<br>
    should add a dedicated function to do so in numpy.lib.recfunctions<br>
    which does not depend on the binary representation of the array.<br>
<br>
<br>
I don't really want to defend an obsolete (?) usecase of structured dtypes.<br>
<br>
However, I think there should be a decision about the future plans for whether dataframe like usages of structure dtypes or through higher level classes or functions are still supported, instead of removing slowly and silently (*) the foundation for this use case, either support this usage or say you will be dropping it.<br>
<br>
(*) I didn't read the details of the release notes<br>
<br>
<br>
And another footnote about obsolete:<br>
Given that I'm the only one arguing about the dataframe_like usecase of recarrays and structured dtypes, I think they are dead for this specific usecase and only my inertia and conservativeness kept them alive in statsmodels.<br>
<br>
<br>
Josef<br>
</div></div></blockquote>
<br>
It's a bit of a stretch to say that we are "silently" dropping support for dataframe-like use of structured arrays.<br>
<br>
First, we still allow pretty much all dataframe-like use we have supported since numpy 1.7, limited as it may be. We are really only dropping one very specialized, expert use involving an explicit view, which I still have doubts was ever more than a hack. That 2008 mailing list message didn't involve multi-field indexing, which didn't exist then (only introduced in 2009), and we have wanted to make them views (not copies) since their inception.<br></blockquote><div><br></div></div></div><div>The 2008 mailing list thread introduced me to the working with views on structured arrays as the ONLY way to switch between structured and homogenous dtypes (if the underlying item size was homogeneous).</div><div>The new stats.models started in 2009.</div><span class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
Second, I don't think we are doing so silently: We have warned about this in release notes since numpy 1.7 in 2012/2013, and it gets mention in most releases since then. We have also raised FutureWarnings about it since 1.7. Unfortunately we missed warning in your specific case for a while, but we corrected this in 1.12 so you should have seen FutureWarnings since then.<br></blockquote><div><br></div></span><div>If I see warnings in the test suite about getting a view instead copy from numpy, then the only/main consequence I think about is whether I need to watch out for inline modification. </div><div>I didn't expect that the followup computation would change, and that it's a padded view and not a view on the selected memory. However, I just checked and padding is mentioned in the 1.12 release notes (which I never read before, ).</div><div><br></div><div>AFAICS, one problem is that the padded view didn't come with the matching down stream usage support, the pack function as mentioned, an alternative way to convert to a standard ndarray, copy doesn't get rid of the padding and so on.</div><div><br></div><div>eg. another mailing list thread I just found with the same problem</div><div><a href="http://numpy-discussion.10968.n7.nabble.com/view-of-recarray-issue-td32001.html" target="_blank">http://numpy-discussion.10968.<wbr>n7.nabble.com/view-of-recarray<wbr>-issue-td32001.html</a><br></div><div><br></div><div>quoting Ralf:</div><div>

<span style="color:rgb(0,0,0);font-family:Verdana,Geneva,Helvetica,Arial,sans-serif;font-size:13.44px;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Question: is that really the recommended way to get an (N, 2) size float array from two columns of a larger record array? If so, why isn't there a better way? If you'd want to write to that (N, 2) array you have to append a copy, making it even uglier. Also, then there really should be tests for views in test_records.py.</span>

<br></div><div><br></div><div><br></div><div>This "better way" never showed up, AFAIK. And it looks like we came back to this problem every few years.</div><span class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-HOEnZb"><font color="#888888"><div><br></div><div>Josef</div></font></span><div><div class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-h5"><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
I don't feel the need to officially declare that we are dropping support for dataframe-like use of structured arrays. It's unclear where that use ends and other uses of structured arrays begin. I think updating the docs to warn that pandas/dask may be a better choice is enough, as I've been doing, and then users can decide for themselves. </blockquote><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
<br>
There is still the question about whether we should make numpy.lib.recfunctions more official. I don't have a strong opinion. I suppose it would be good to add a section to the structured array docs which lists those methods and says something like<br>
<br>
"the submodule numpy.lib.recfunctions provides minimal functionality to split, combine, and manipulate structured datatypes and arrays. In most cases, we strongly recommend users use a dedicated module such as pandas/xarray/dask instead of these methods, but they are provided for occasional convenience."<span class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-HOEnZb"><font color="#888888"><br>
<br>
Allan</font></span><div class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-HOEnZb"><div class="gmail-m_3390799139455319992gmail-m_7217771562085024634gmail-m_8302832195889329100gmail-h5"><br>
<br>
<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
    Allan<br>
<br>
<br>
             Josef<br>
<br>
<br>
                 Allan<br>
<br>
                 ><br>
                 >     Cheers!<br>
                 >     Ben Root<br>
                 ><br>
                 >     On Mon, Jan 29, 2018 at 3:24 PM,<br>
        <<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a> <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a> <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>>><br>
                 >     <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>> <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>>><wbr>>> wrote:<br>
                 ><br>
                 ><br>
                 ><br>
                 >         On Mon, Jan 29, 2018 at 2:55 PM, Stefan van<br>
        der Walt<br>
                 >         <<a href="mailto:stefanv@berkeley.edu" target="_blank">stefanv@berkeley.edu</a><br>
        <mailto:<a href="mailto:stefanv@berkeley.edu" target="_blank">stefanv@berkeley.edu</a>> <mailto:<a href="mailto:stefanv@berkeley.edu" target="_blank">stefanv@berkeley.edu</a><br>
        <mailto:<a href="mailto:stefanv@berkeley.edu" target="_blank">stefanv@berkeley.edu</a>>><br>
                 <mailto:<a href="mailto:stefanv@berkeley.edu" target="_blank">stefanv@berkeley.edu</a><br>
        <mailto:<a href="mailto:stefanv@berkeley.edu" target="_blank">stefanv@berkeley.edu</a>> <mailto:<a href="mailto:stefanv@berkeley.edu" target="_blank">stefanv@berkeley.edu</a><br>
        <mailto:<a href="mailto:stefanv@berkeley.edu" target="_blank">stefanv@berkeley.edu</a>>><wbr>>> wrote:<br>
                 ><br>
                 >             On Mon, 29 Jan 2018 14:10:56 -0500,<br>
        <a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a> <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a> <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>>><br>
                  >             <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>><br>
<br>
                 <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a><br>
        <mailto:<a href="mailto:josef.pktd@gmail.com" target="_blank">josef.pktd@gmail.com</a>>><wbr>> wrote:<br>
                  ><br>
                  >                 Given that there is pandas, xarray,<br>
        dask and<br>
                 more, numpy<br>
                  >                 could as well drop<br>
                  >                 any pretense of supporting<br>
        dataframe_likes.<br>
                 Or, adjust<br>
                  >                 the recfunctions so<br>
                  >                 we can still work dataframe_like<br>
        with structured<br>
                  >                 dtypes/recarrays/recfunctions<wbr>.<br>
                  ><br>
                  ><br>
                  >             I haven't been following the duckarray<br>
        discussion<br>
                 carefully,<br>
                  >             but could<br>
                  >             this be an opportunity for a dataframe<br>
        protocol,<br>
                 so that we<br>
                  >             can have<br>
                  >             libraries ingest structured arrays, record<br>
                 arrays, pandas<br>
                  >             dataframes,<br>
                  >             etc. without too much specialized code?<br>
                  ><br>
                  ><br>
                  >         AFAIU while not being in the data handling area,<br>
                 pandas defines<br>
                  >         the interface and other libraries provide pandas<br>
                 compatible<br>
                  >         interfaces or implementations.<br>
                  ><br>
                  >         statsmodels currently still has recarray<br>
        support and<br>
                 usage. In<br>
                  >         some interfaces we support pandas, recarrays and<br>
                 plain arrays,<br>
                  >         or anything where asarray works correctly.<br>
                  ><br>
                  >         But recarrays became messy to support, one<br>
        rewrite of<br>
                 some<br>
                  >         functions last year converts recarrays to<br>
        pandas,<br>
                 does the<br>
                  >         manipulation and then converts back to<br>
        recarrays.<br>
                  >         Also we need to adjust our recarray usage<br>
        with new numpy<br>
                  >         versions. But there is no real benefit because I<br>
                 doubt that<br>
                  >         statsmodels still has any<br>
        recarray/structured dtype<br>
                 users. So,<br>
                  >         we only have to remove our own uses in the<br>
        datasets<br>
                 and unit tests.<br>
                  ><br>
                  >         Josef<br>
                  ><br>
                  ><br>
                  ><br>
                  ><br>
                  >             Stéfan<br>
                  ><br>
                  >                     _____________________________<wbr>__________________<br>
                  >             NumPy-Discussion mailing list<br>
                  > <a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>>>><br>
                  ><br>
        <a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
                        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>>><br>
                 >                     <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mail<wbr>man/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
                        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>>><wbr>><br>
                 ><br>
                 ><br>
                 ><br>
                 >         _____________________________<wbr>__________________<br>
                 >         NumPy-Discussion mailing list<br>
                  > <a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>>>><br>
                  ><br>
        <a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
                        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>>><br>
                 >                 <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mail<wbr>man/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
                        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>>><wbr>><br>
                 ><br>
                 ><br>
                 ><br>
                 >     _____________________________<wbr>__________________<br>
                 >     NumPy-Discussion mailing list<br>
                  > <a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
                 <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>>>><br>
                  ><br>
        <a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
                        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>>><br>
                  >                     <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mail<wbr>man/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
                        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>>><wbr>><br>
                  ><br>
                  ><br>
                  ><br>
                  ><br>
                  > ______________________________<wbr>_________________<br>
                  > NumPy-Discussion mailing list<br>
                  > <a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>>><br>
                  ><br>
        <a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
                        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>>><br>
                  ><br>
<br>
                 ______________________________<wbr>_________________<br>
                 NumPy-Discussion mailing list<br>
        <a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a> <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a><br>
        <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>>><br>
        <a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
                        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>>><br>
<br>
<br>
<br>
<br>
<br>
        ______________________________<wbr>_________________<br>
        NumPy-Discussion mailing list<br>
        <a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a> <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
        <a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
        <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
<br>
<br>
    ______________________________<wbr>_________________<br>
    NumPy-Discussion mailing list<br>
    <a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a> <mailto:<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@pytho<wbr>n.org</a>><br>
    <a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
    <<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailm<wbr>an/listinfo/numpy-discussion</a>><br>
<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
<br>
</blockquote>
<br>
______________________________<wbr>_________________<br>
NumPy-Discussion mailing list<br>
<a href="mailto:NumPy-Discussion@python.org" target="_blank">NumPy-Discussion@python.org</a><br>
<a href="https://mail.python.org/mailman/listinfo/numpy-discussion" rel="noreferrer" target="_blank">https://mail.python.org/mailma<wbr>n/listinfo/numpy-discussion</a><br>
</div></div></blockquote></div></div></div><br></div></div>
</blockquote></div></div></div><br></div></div>
</blockquote></div><br></div></div>