I would like to hear your opinion on developing an explicit sparse/dense 2D matrix class with indexing similar to Matlab, and without significant differences between sparse and dense matrices from the user's perspective...  
<br><br>I know that it&#39;s not one of Numpy/Scipy&#39;s goals to clone Matlab,&nbsp; but I think I represent a potentially large scientific Python user base,&nbsp; who would find Python matrices that feel a bit more like Matlab/Octave etc. extremely useful.&nbsp; I have a great respect for all the work in Numpy and Scipy,&nbsp; 
<br>but at the same time I feel that numerical linear algebra in Python would benefit from a more dedicated matrix library,&nbsp; and I think that Numpy (or another single package) should provide that<br>in a homogeneous way - without ties to how Numpy array works.
<br><br>- Joachim<br><br><br><div><span class="gmail_quote">On 3/27/07, <b class="gmail_sendername">Christopher Barker</b> &lt;<a href="mailto:Chris.Barker@noaa.gov">Chris.Barker@noaa.gov</a>&gt; wrote:</span><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Zachary Pincus wrote:<br>&gt; rest of linear algebra -- e.g. that m[0] yields a matrix if m is a<br>&gt; matrix-- it almost certainly would violate the principle of least<br>&gt; surprise for iteration over m (intuitively understood to be choosing m
<br>&gt; [0] then m[1] and so forth) to yield anything other than a matrix.<br><br>I don&#39;t think the OP was suggesting that. Rather, I think the suggestion<br>was that for a&nbsp;&nbsp;mXn matrix, M:<br><br>M[i].shape == (n,)<br>
<br>M[i:i+1].shape == (1,n)<br><br>that is, indexing (or iterating returns a vector, and slicing returns a<br>matrix). This is, indeed exactly how numpy arrays behave!<br><br>The problem with this is:<br><br>numpy matrices were created specifically to support linear algebra
<br>calculations. For linear algebra, the distinction between row vectors<br>and column vectors is critical. By definition, a row vector has shape:<br>(1,n), and a column vector has shape (m,1).<br><br>In this case, perhaps the OP is thinking that a shape (n,) array could
<br>be considered a row vector, but in that case:<br><br>M[1,:].shape == (n,)<br>M[:,1].shape == (m,)<br><br>which of these is the row and which the column? This is why matrices<br>index this way instead:<br><br>M[1,:].shape == (1, n)
<br>M[:,1].shape == (m, 1)<br><br>now we know exactly what is a row and what is a column.<br><br>By the way, I think with the way numpy works: M[i] == M[i,:] by<br>definition, so those couldn&#39;t yield different shaped results. Is that right?
<br><br>I think we got a bit sidetracked by the example given. If I have a bunch<br>of points I want to store, I&#39;m going to use an (m,2) *array*, not a<br>matrix, then then A[i] will yield a (2,) array, which makes sense for
<br>(2-d) points. In fact, I do this a LOT.<br><br>If I happen to need to do some linear algebra on that array of points,<br>I&#39;ll convert to a matrix, do the linear algebra, then convert back to an<br>a array (or just use the linear algebra functions on the array).
<br><br>I hope this helps<br><br>-Chris<br><br><br><br><br><br><br><br><br>&gt; This can&#39;t possibly be what you&#39;re asking for, right? You aren&#39;t<br>&gt; suggesting that m[0] and list(iter(m))[0] should be different types?
<br>&gt;<br>&gt; There are many clear and definite use cases for m[0] being a matrix,<br>&gt; by the way, in addition to the theoretical arguments -- these aren&#39;t<br>&gt; hard to come by. Whether or nor there are actual good use-cases for
<br>&gt; iterating over a matrix, if you believe that m[0] should be a matrix,<br>&gt; it&#39;s madness to suggest that list(iter(m))[0] should be otherwise.<br>&gt;<br>&gt; My opinion? Don&#39;t iterate over matrices. Use matrices for linear
<br>&gt; algebra. There&#39;s no &quot;iteration&quot; construct in linear algebra. The<br>&gt; behavior you find so puzzling is a necessary by-product of the<br>&gt; fundamental behavior of the matrix class -- which has been explained
<br>&gt; and which you offered no resistance to.<br>&gt;<br>&gt; Zach<br>&gt;<br>&gt; _______________________________________________<br>&gt; Numpy-discussion mailing list<br>&gt; <a href="mailto:Numpy-discussion@scipy.org">
Numpy-discussion@scipy.org</a><br>&gt; <a href="http://projects.scipy.org/mailman/listinfo/numpy-discussion">http://projects.scipy.org/mailman/listinfo/numpy-discussion</a><br><br>--<br>Christopher Barker, Ph.D.<br>Oceanographer
<br><br>Emergency Response Division<br>NOAA/NOS/OR&amp;R&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(206) 526-6959&nbsp;&nbsp; voice<br>7600 Sand Point Way NE&nbsp;&nbsp; (206) 526-6329&nbsp;&nbsp; fax<br>Seattle, WA&nbsp;&nbsp;98115&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (206) 526-6317&nbsp;&nbsp; main reception<br><br><a href="mailto:Chris.Barker@noaa.gov">
Chris.Barker@noaa.gov</a><br>_______________________________________________<br>Numpy-discussion mailing list<br><a href="mailto:Numpy-discussion@scipy.org">Numpy-discussion@scipy.org</a><br><a href="http://projects.scipy.org/mailman/listinfo/numpy-discussion">
http://projects.scipy.org/mailman/listinfo/numpy-discussion</a><br></blockquote></div><br>