[Numpy-discussion] Accessing rank-0 array value?

Tim Hochberg tim.hochberg at cox.net
Tue Jun 8 08:44:10 EDT 2004


[SNIP]

>>>>a[0]
>>>>        
>>>>
>Traceback (most recent call last):
>  File "<stdin>", line 1, in ?
>IndexError: Too many indices
>
>by something like:
>
>  
>
>>>>a[0]
>>>>        
>>>>
>Traceback (most recent call last):
>  File "<stdin>", line 1, in ?
>IndexError: rank-0 arrays don't accept integer indices. Use '()' (empty tuple)
>instead.
>
This seems like a sensible idea. One might further restrict this and 
only raise it when a rank-0 array is indexed with zero, which is the 
only real case that causes confusion. In that case, I suggest the error 
message similar to:

IndexError: Too many indices (Use A[()] to get scalar from rank-0 array A)


>In order to provide an universal accessor to numarray objects, what about
>adding a .toscalar() (or .toobject()) method to them? That would return a
>python object whether you are using rank-0 arrays, regular arrays,
>CharArrays or RecArrays. That object would be the minimal python container
>that would keep the values inside these objects. In case of rank-0 arrays it
>would return a Bool, Int, Float or Complex. For a regular array, a list
>(perhaps a tuple?). For CharArrays, a list (tuple?) of strings. And for
>RecArrays a list (tuple) of tuples.


That's an interesting idea. `tolist` doesn't work on rank-0 arrays, 
sensibly enough. I would expect something called toscalar to only work 
on rank-0 arrays. I don't like that since I would like to see fewer 
special cases for rank-0 arrays not less. However, something called 
`toobject` (or `topyobject`, `tocoreobject`, etc) could return a core 
python object that was equivalent to the original array, which I believe 
is what you describe above. For example, after:

obj = anArray.toobject()
type = anArray.type()
newArray = numarray.array(obj, type)

`newArray` would always be equal to `anArray` in both value and type. 
The implementation of toobject could be as simple as:

    def toobject(self):
       if self.rank == 0:
          return self[()]
       else:
          return self.tolist()

I'm not entirely convinced it's a good idea yet; I'd have to see some 
use cases, but it's an interesting idea in any event.


>Incidentally, I've noted an inconsistency in the .tostring behaviour:
>
>  
>
>>>>a=array(126)
>>>>a.tostring()
>>>>        
>>>>
>''
>  
>
Interesting. That's better than the memory error I get with 
Numarray-0.8. Or the indefinite hang I get with numarray 0.9.

>while I would expect a return value like:
>
>  
>
>>>>chr(126)
>>>>        
>>>>
>'~'
>  
>
I think it should actually be returning the same things as 
array([126]).tostring(). That is:

'\x80\x00\x00\x00'


[SNIP]

Regards,

-tim





More information about the NumPy-Discussion mailing list