[Numpy-discussion] Best representation for array of points, or, how to distinguish a Nx1 array of points from a Nx3 array of scalars

Robert Kern robert.kern at gmail.com
Thu Oct 4 15:51:09 EDT 2007


Edson Tadeu wrote:
> For now, I solved it using a view with a different type:
> 
> from numpy import *
> N = 5
> a=zeros(N,'3f8')
> b=a.view()
> b.dtype='f8'
> b.shape = N,3

Note that this doesn't quite do what you want. I was wrong about the dtype='3f8'
 syntax: it just gives you a regular float array with the shape changed
appropriately (at least in recent version of numpy; if you are getting something
different, what version are you using?).


In [24]: from numpy import *

In [25]: N = 5

In [26]: zeros(N, dtype='3f8')
Out[26]:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])


If you want a shape-(N,) record array, you need a different dtype:


In [28]: zeros(N, dtype='f8,f8,f8')
Out[28]:
array([(0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0),
       (0.0, 0.0, 0.0)],
      dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8')])

In [31]: zeros(N, dtype=dtype([('x', float), ('y', float), ('z', float)]))
Out[31]:
array([(0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0), (0.0, 0.0, 0.0),
       (0.0, 0.0, 0.0)],
      dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8')])


To go back, you can give .view() an argument:


In [30]: zeros(N, dtype='f8,f8,f8').view(dtype((float, 3)))
Out[30]:
array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])


-- 
Robert Kern

"I have come to believe that the whole world is an enigma, a harmless enigma
 that is made terrible by our own mad attempt to interpret it as though it had
 an underlying truth."
  -- Umberto Eco



More information about the NumPy-Discussion mailing list