Screenshot instructions:
Windows
Mac
Red Hat Linux
Ubuntu
Click URL instructions:
Rightclick on ad, choose "Copy Link", then paste here →
(This may not be possible with some types of ads)
From: Rich E <reakinator@gm...>  20081128 22:08:59

Hi all, So I have a nice C library wrapped in python and I'd like to start doing some plots of things in python... the problem is the data is all stuck in C arrays. I'm sure this is a common problem, but I have not found an elegant solution. Right now I have a help function that will return one member of the C array, such as: %inline %{ float getFloat(float *array, int index) { return array[index]; } %} But how would I go about returning a python list of the entire array, or even better, an NumPy array? My thoughts are that I will have to convert between C arrays and python types (list or NumPy) quite often, probably at a refresh rate suitable for animation. Any advice? regards, Rich 
From: Christopher Barker <Chris.Barker@no...>  20081201 19:44:34

Rich E wrote: > So I have a nice C library wrapped in python and I'd like to start > doing some plots of things in python... the problem is the data is all > stuck in C arrays. > But how would I go about returning a python list of the entire array, > or even better, an NumPy array? there is a numpy.i file distributed with numpy ( or with the docs, anyway). There was also a recent post on the numpy list with some extra hints and examples for using it. This is another nice article about it: http://matt.eifelle.com/2008/11/04/exposinganarrayinterfacewithswigforaccstructure/ > My thoughts are that I will have to convert between C arrays and > python types (list or NumPy) quite often, probably at a refresh rate > suitable for animation. the above allow a numpy array and your Ccode to share the same pointer, so it is very fast. Chris  Christopher Barker, Ph.D. Oceanographer Emergency Response Division NOAA/NOS/OR&R (206) 5266959 voice 7600 Sand Point Way NE (206) 5266329 fax Seattle, WA 98115 (206) 5266317 main reception Chris.Barker@... 
From: Rich E <reakinator@gm...>  20081201 19:49:52

Someone earlier today in my office pointed me in the same direction, so it looks like the way to go! I'll give it a try.. . thanks (especially for the article link). cheers, Rich On Mon, Dec 1, 2008 at 8:43 PM, Christopher Barker <Chris.Barker@...> wrote: > Rich E wrote: >> >> So I have a nice C library wrapped in python and I'd like to start >> doing some plots of things in python... the problem is the data is all >> stuck in C arrays. > >> But how would I go about returning a python list of the entire array, >> or even better, an NumPy array? > > there is a numpy.i file distributed with numpy ( or with the docs, anyway). > There was also a recent post on the numpy list with some extra hints and > examples for using it. > > This is another nice article about it: > > http://matt.eifelle.com/2008/11/04/exposinganarrayinterfacewithswigforaccstructure/ > > >> My thoughts are that I will have to convert between C arrays and >> python types (list or NumPy) quite often, probably at a refresh rate >> suitable for animation. > > the above allow a numpy array and your Ccode to share the same pointer, so > it is very fast. > > Chris > > >  > Christopher Barker, Ph.D. > Oceanographer > > Emergency Response Division > NOAA/NOS/OR&R (206) 5266959 voice > 7600 Sand Point Way NE (206) 5266329 fax > Seattle, WA 98115 (206) 5266317 main reception > > Chris.Barker@... > 
From: Rich E <reakinator@gm...>  20081208 14:09:36

On Mon, Dec 1, 2008 at 8:43 PM, Christopher Barker <Chris.Barker@...> wrote: > Rich E wrote: >> >> So I have a nice C library wrapped in python and I'd like to start >> doing some plots of things in python... the problem is the data is all >> stuck in C arrays. > >> But how would I go about returning a python list of the entire array, >> or even better, an NumPy array? > > there is a numpy.i file distributed with numpy ( or with the docs, anyway). > There was also a recent post on the numpy list with some extra hints and > examples for using it. > > This is another nice article about it: > > http://matt.eifelle.com/2008/11/04/exposinganarrayinterfacewithswigforaccstructure/ After looking at this example, I have to admit that I am a bit befuddled. I also couldn't get the code to work, but this is probably because I am not understanding the example. So, I'll ask a couple questions here and if there is a better place to do this, please let me know. In the example, Matt is converting data in a c struct.. all I want to do is, provided a pointer to a c array and the size of the array, convert it to a numpy array. Hopefully then I will not have to write a wrapper for every type of struct I have (and even worse, every function that handles pointers to arrays). I would think such a function could be quite general, enough to even be included with numpy. Matt's code is quite specific to the struct he is handling and it is difficult to see what is necessary for my very minimal needs. > >> My thoughts are that I will have to convert between C arrays and >> python types (list or NumPy) quite often, probably at a refresh rate >> suitable for animation. > > the above allow a numpy array and your Ccode to share the same pointer, so > it is very fast. > > Chris > > >  > Christopher Barker, Ph.D. > Oceanographer > > Emergency Response Division > NOAA/NOS/OR&R (206) 5266959 voice > 7600 Sand Point Way NE (206) 5266329 fax > Seattle, WA 98115 (206) 5266317 main reception > > Chris.Barker@... > 
From: Rich E <reakinator@gm...>  20081221 18:12:48

Well I've made progress. In the numpy svn there is a good deal of documentation about how to use the typemaps in numpy.i (btw, none of which is related to the posted link I was previously/am confused about). It is quite simple to add an %apply directive in the interface file like: %apply (int DIM1, float* INPLACE_ARRAY1) {(int sizeWaveform, float* pWaveform)}; which will then search and replace any function that has the two variables in this format, effectively allowing the function to operate on a numpy array. But what if I have multiple array pointers in the same function? For example, here is a function in my library that converts spectra in rectangular coordinates to polar form: /*! \brief compute magnitude spectrum of a DFT * * \param sizeMag size of output Magnitude (half of input real FFT) * \param pFReal pointer to input FFT real array (real/imag floats) * \param pFMAg pointer to float array of magnitude spectrum */ void sms_spectrumMag( int sizeMag, float *pInRect, float *pOutMag) { int i, it2; float fReal, fImag; for (i=0; i<sizeMag; i++) { it2 = i << 1; fReal = pInRect[it2]; fImag = pInRect[it2+1]; pOutMag[i] = sqrtf(fReal * fReal + fImag * fImag); } } There are two arrays, one is half the size of the other. But, SWIG doesn't know this, according to the type map it will think *pInRect is of size sizeMag and will not know anything about *pOutMag. So what is the solution in this case? I assume that I will have to make my own typemap based on the numpy.i file, but I cannot tell how complicated or straightfoward this will be yet. I certainly don't want to start adding unnecessary size integers to the c functions. regards, Rich On Mon, Dec 8, 2008 at 3:09 PM, Rich E <reakinator@...> wrote: > On Mon, Dec 1, 2008 at 8:43 PM, Christopher Barker > <Chris.Barker@...> wrote: >> Rich E wrote: >>> >>> So I have a nice C library wrapped in python and I'd like to start >>> doing some plots of things in python... the problem is the data is all >>> stuck in C arrays. >> >>> But how would I go about returning a python list of the entire array, >>> or even better, an NumPy array? >> >> there is a numpy.i file distributed with numpy ( or with the docs, anyway). >> There was also a recent post on the numpy list with some extra hints and >> examples for using it. >> >> This is another nice article about it: >> >> http://matt.eifelle.com/2008/11/04/exposinganarrayinterfacewithswigforaccstructure/ > > After looking at this example, I have to admit that I am a bit > befuddled. I also couldn't get the code to work, but this is probably > because I am not understanding the example. So, I'll ask a couple > questions here and if there is a better place to do this, please let > me know. > > In the example, Matt is converting data in a c struct.. all I want to > do is, provided a pointer to a c array and the size of the array, > convert it to a numpy array. Hopefully then I will not have to write > a wrapper for every type of struct I have (and even worse, every > function that handles pointers to arrays). > > I would think such a function could be quite general, enough to even > be included with numpy. Matt's code is quite specific to the struct > he is handling and it is difficult to see what is necessary for my > very minimal needs. > >> >>> My thoughts are that I will have to convert between C arrays and >>> python types (list or NumPy) quite often, probably at a refresh rate >>> suitable for animation. >> >> the above allow a numpy array and your Ccode to share the same pointer, so >> it is very fast. >> >> Chris >> >> >>  >> Christopher Barker, Ph.D. >> Oceanographer >> >> Emergency Response Division >> NOAA/NOS/OR&R (206) 5266959 voice >> 7600 Sand Point Way NE (206) 5266329 fax >> Seattle, WA 98115 (206) 5266317 main reception >> >> Chris.Barker@... >> > 
From: Rich E <reakinator@gm...>  20081221 19:07:07

I'm going to expand on what I think I need to do, which is modify the typemap to fit my specific format. So this is what I'm thinking: I start with this code for the typemap: /* Typemap suite for (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) */ %typecheck(SWIG_TYPECHECK_DOUBLE_ARRAY, fragment="NumPy_Macros") (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) { $1 = is_array($input) && PyArray_EquivTypenums(array_type($input), DATA_TYPECODE); } %typemap(in, fragment="NumPy_Fragments") (DIM_TYPE DIM1, DATA_TYPE* INPLACE_ARRAY1) (PyArrayObject* array=NULL, int i=0) { array = obj_to_array_no_conversion($input, DATA_TYPECODE); if (!array  !require_dimensions(array,1)  !require_contiguous(array)  !require_native(array)) SWIG_fail; $1 = 1; for (i=0; i < array_numdims(array); ++i) $1 *= array_size(array,i); $2 = (DATA_TYPE*) array_data(array); } and try to alter it to allow for a conversion of type: (DIM_TYPE DIM1, DATA_TYPE* ARRAY1, DATA_TYPE* ARRAY2) where ARRAY1 is size DIM1 * 2 and ARRAY2 is size DIM1. Then I can %apply this to my function that I mentioned in the last post. So here are my first two questions: 1) where is DIM1 used to declare the array size? I don't see where it is used at all, and I need to somewhere multiply it by 2 to declare the size of ARRAY1 2) I am not understanding where $input comes from, so I do not understand how to distinguish between ARRAY1 and ARRAY2. In the attempt I have already tried, I think I just use the pointer to ARRAY1 twice. On Sun, Dec 21, 2008 at 7:12 PM, Rich E <reakinator@...> wrote: > Well I've made progress. In the numpy svn there is a good deal of > documentation about how to use the typemaps in numpy.i (btw, none of > which is related to the posted link I was previously/am confused > about). > > It is quite simple to add an %apply directive in the interface file like: > > %apply (int DIM1, float* INPLACE_ARRAY1) {(int sizeWaveform, float* pWaveform)}; > > which will then search and replace any function that has the two > variables in this format, effectively allowing the function to operate > on a numpy array. > > But what if I have multiple array pointers in the same function? For > example, here is a function in my library that converts spectra in > rectangular coordinates to polar form: > > /*! \brief compute magnitude spectrum of a DFT > * > * \param sizeMag size of output Magnitude (half of input real FFT) > * \param pFReal pointer to input FFT real array (real/imag floats) > * \param pFMAg pointer to float array of magnitude spectrum > */ > void sms_spectrumMag( int sizeMag, float *pInRect, float *pOutMag) > { > int i, it2; > float fReal, fImag; > > for (i=0; i<sizeMag; i++) > { > it2 = i << 1; > fReal = pInRect[it2]; > fImag = pInRect[it2+1]; > pOutMag[i] = sqrtf(fReal * fReal + fImag * fImag); > } > } > > > There are two arrays, one is half the size of the other. But, SWIG > doesn't know this, according to the type map it will think *pInRect is > of size sizeMag and will not know anything about *pOutMag. > > So what is the solution in this case? I assume that I will have to > make my own typemap based on the numpy.i file, but I cannot tell how > complicated or straightfoward this will be yet. I certainly don't > want to start adding unnecessary size integers to the c functions. > > regards, > Rich > > > On Mon, Dec 8, 2008 at 3:09 PM, Rich E <reakinator@...> wrote: >> On Mon, Dec 1, 2008 at 8:43 PM, Christopher Barker >> <Chris.Barker@...> wrote: >>> Rich E wrote: >>>> >>>> So I have a nice C library wrapped in python and I'd like to start >>>> doing some plots of things in python... the problem is the data is all >>>> stuck in C arrays. >>> >>>> But how would I go about returning a python list of the entire array, >>>> or even better, an NumPy array? >>> >>> there is a numpy.i file distributed with numpy ( or with the docs, anyway). >>> There was also a recent post on the numpy list with some extra hints and >>> examples for using it. >>> >>> This is another nice article about it: >>> >>> http://matt.eifelle.com/2008/11/04/exposinganarrayinterfacewithswigforaccstructure/ >> >> After looking at this example, I have to admit that I am a bit >> befuddled. I also couldn't get the code to work, but this is probably >> because I am not understanding the example. So, I'll ask a couple >> questions here and if there is a better place to do this, please let >> me know. >> >> In the example, Matt is converting data in a c struct.. all I want to >> do is, provided a pointer to a c array and the size of the array, >> convert it to a numpy array. Hopefully then I will not have to write >> a wrapper for every type of struct I have (and even worse, every >> function that handles pointers to arrays). >> >> I would think such a function could be quite general, enough to even >> be included with numpy. Matt's code is quite specific to the struct >> he is handling and it is difficult to see what is necessary for my >> very minimal needs. >> >>> >>>> My thoughts are that I will have to convert between C arrays and >>>> python types (list or NumPy) quite often, probably at a refresh rate >>>> suitable for animation. >>> >>> the above allow a numpy array and your Ccode to share the same pointer, so >>> it is very fast. >>> >>> Chris >>> >>> >>>  >>> Christopher Barker, Ph.D. >>> Oceanographer >>> >>> Emergency Response Division >>> NOAA/NOS/OR&R (206) 5266959 voice >>> 7600 Sand Point Way NE (206) 5266329 fax >>> Seattle, WA 98115 (206) 5266317 main reception >>> >>> Chris.Barker@... >>> >> > 
Sign up for the SourceForge newsletter:
No, thanks