[SciPy-user] array vs matrix, converting code from matlab

Gennan Chen gnchen at cortechs.net
Thu Apr 20 15:58:37 CDT 2006


Hi! Travis,

Thanks for your suggestion. In fact, that is what I do. Creating a  
class and use __getitem__ to swap the indices. Unfortunately, In the  
medical imaging, index (i,j,k) is always related to FORTRAN way.

Gen


On Apr 20, 2006, at 1:44 PM, Travis Oliphant wrote:

> Gennan Chen wrote:
>
>> Hi! Travis,
>>
>> Let's start with an example under matlab:
>>
>>>> d = [0:23]
>>>> k = reshape(d, 3,4,2)
>> k(:,:,1) =
>> 0  3  6  9
>> 1  4  7  10
>> 2  5  8  11
>> k(:,:,2) =
>> 12  15  18  21
>> 13  16  19  22
>> 14  17  20  23
>>
>>
>>
>
> This is a FORTRAN-order reshaping.   The linear sequence of values is
> reshaped into an array by varying the first index (the row) the  
> fastest.
>
> NumPy, by default, uses C-contiguous order so that the last index  
> varies
> the fastest as it places elements in the array.
>
> NumPy does have support for the FORTRAN-order, but there are a few
> constructs that don't support it: (arr.flat iterators are always in
> C-contiguous order and a.shape = (3,4,2) always assumes C-contiguous
> order for advancing through the elements).   I don't know of anyone  
> who
> has used the FORTRAN  support to successfully convert MATLAB code  so
> unless you want to be a guinea pig, you might want to just hunker down
> and convert to C-contiguous order.  Alternatively you can just re- 
> think
> the shape of your arrays in reverse:  i.e. instead of creating a 3,4,2
> array,  create a 2,4,3 array and reverse all your indices.
>
>> So, if I want to port my Matlab code, I need to pay attention to
>> this. And Since I  have a lot of C/C++  mexing code in Matlab, I need
>> to fix not just 1-0 based but also indexing issue here. Any chance I
>> can make the indexing like the Matlab's way?  Or I should just hunker
>> down...
>>
>>
> As far as the indexing is concerned.  The only way to alter it is to
> implement a new class that subtracts 1 from all the indices.  You  
> could
> also define "end" as a simple object and when you see it replace with
> the number of dimension in the array.   Such a thing is possible (you
> could also implement it to reverse the order of all your indices and
> simulate a matlab-style array).
>
> -Travis
>
>
> _______________________________________________
> SciPy-user mailing list
> SciPy-user at scipy.net
> http://www.scipy.net/mailman/listinfo/scipy-user
>



More information about the SciPy-user mailing list