[SciPy-dev] Nested arrays

Travis Oliphant oliphant.travis at ieee.org
Wed Jan 11 03:26:12 EST 2006


Fernando Perez wrote:

>Travis Oliphant wrote:
>
>  
>
>>I've committed two changes
>>
>>1) Now all object array-scalars look to the proxied object for it's 
>>mapping, sequence, and buffer behavior
>>    
>>
>
>I wonder if the scalars returned by object arrays should't just be the plain, 
>'unboxed' underlying object.  Here, I agree with Robert that object arrays are 
>special anyway, and the main purpose of using ndarrays of 'O' type is so you 
>have the convenient indexing, slicing and arithmetic syntactic support of 
>ndarrays.  I see object arrays basically as a way of 'carrying around' a 
>collection of arbitrary python objects.
>
>But having scalar indexing return an opaque proxy breaks almost completely 
>this kind of usage, because you can't get back, in a straightforward manner, 
>the things you put in the container to begin with.  This should illustrate my 
>point:
>  
>

Frankly, I'm willing to get rid of them.  I suggested that a couple of 
months ago, but a few people said that having the attributes even on 
object scalars was going to be useful, so I capitulated and just tried 
to improve the proxying...

I suppose a more thorough discussion is warranted.  I think with some 
effort one could figure out how to make it always appear that the object 
array-scalar type is the actual underlying object but now with the 
attributes of arrays.

Repeat your example with a new-style class, to see what you get however.

In [1]: from scipy import *

In [2]: x = empty(2, object)

In [3]: class foo(object):
   ...:     def hi(self):
   ...:         return 'hi'
   ...:

In [4]: x[0] = foo()

In [5]: x[1] = foo()

In [6]: x[0].hi()
Out[6]: 'hi'

In [7]: x[0]
Out[7]: <__main__.foo object at 0x47ff345c>

In [8]: isinstance(x[0], foo)
Out[8]: True

In [9]: type(x[0])
Out[9]: <type 'object_arrtype'>


So, at least with new-style classes we are getting something useful.  
Notice that also

In [10]: x[0].shape
Out[10]: ()

In [11]: x[0].strides
Out[11]: ()

In [12]: x[0].flags
Out[12]:
{'ALIGNED': True,
 'CONTIGUOUS': True,
 'FORTRAN': True,
 'OWNDATA': True,
 'UPDATEIFCOPY': False,
 'WRITEABLE': False}


So, I'm still undecided.  Perhaps we can figure out why old-style 
classes aren't working this way...

-Travis






More information about the SciPy-Dev mailing list