470,821 Members | 2,041 Online

# Custom data type in a matrix.

Hi guys. I've been lookig for this in the numpy pdf manual, in this

Is there a way to create a custom data type (eg: Name: string(30), Age:
int(2), married: boolean, etc) and then use that custom data in a
matrix? Actually, this is a two question question :P

Im doing a simple hex based game and i need a way to store every hex
property (color, owner,x, y, etc) in a matrix's "cell", representing
each cell a hex.

Thank you.

Apr 23 '06 #1
6 2074
BTW, i tried the "classe Thinge(): pass" but does not qualify as "data
type" for a numpy array.

Apr 23 '06 #2
Gaz wrote:
Hi guys. I've been lookig for this in the numpy pdf manual, in this
You will probably want to look or ask on the numpy list, too.

https://lists.sourceforge.net/lists/...mpy-discussion
Is there a way to create a custom data type (eg: Name: string(30), Age:
int(2), married: boolean, etc) and then use that custom data in a
matrix? Actually, this is a two question question :P

Yes. Use record arrays. They are discussed in section 8.5 of the _The Guide to
NumPy_ if you have the book. There is another example of using record arrays on
the SciPy wiki (although it is less focused on combining different data types
than it is named column access):

http://www.scipy.org/RecordArrays

Here is an example:

In [18]: from numpy import *

In [19]: rec.fromrecords([['Robert', 25, False], ['Thomas', 53, True]],
names='name,age,married', formats=['S30', int, bool])
Out[19]:
recarray([('Robert', 25, False), ('Thomas', 53, True)],
dtype=[('name', '|S30'), ('age', '>i4'), ('married', '|b1')])

In [21]: Out[19].name
Out[21]:
chararray([Robert, Thomas],
dtype='|S30')

In [22]: Out[19].age
Out[22]: array([25, 53])

In [23]: Out[19].married
Out[23]: array([False, True], dtype=bool)

You can also use object arrays if you need to implement classes and not just
dumb, basic types:

In [33]: class Hex(dict):
....: def __init__(self, **kwds):
....: dict.__init__(self, **kwds)
....: self.__dict__ = self
....:
....:

In [34]: field = array([Hex(color=(0,0,0), owner='Player1', x=10, y=20,
etc='Black hex owned by Player1'),
....: Hex(color=(1,1,1), owner='Player2', x=10, y=21,
etc='White hex owned by Player2')], dtype=object)

In [35]:

In [35]: field
Out[35]: array([{'y': 20, 'etc': 'Black hex owned by Player1', 'color': (0, 0,
0), 'owner': 'Player1', 'x': 10}, {'y': 21, 'etc': 'White hex owned by Player2',
'color': (1, 1, 1), 'owner': 'Player2', 'x': 10}], dtype=object)

--
Robert Kern
ro*********@gmail.com

"I have come to believe that the whole world is an enigma, a harmless enigma
an underlying truth."
-- Umberto Eco

Apr 23 '06 #3
Gaz schrieb:
Hi guys. I've been lookig for this in the numpy pdf manual, in this

Is there a way to create a custom data type (eg: Name: string(30), Age:
int(2), married: boolean, etc) and then use that custom data in a
matrix? Actually, this is a two question question :P

Im doing a simple hex based game and i need a way to store every hex
property (color, owner,x, y, etc) in a matrix's "cell", representing
each cell a hex.

You don't want numpy - you want ordinary lists in lists. Consider this:

class Hex(object):
def __init__(self, x, y):
self.x, self.y = x, y
self.terrain_type = "unknown"
map = [[Hex(x, y) for y in xrange(height)] for x in xrange(width)]
There is no advantage of using numpy whatsoever - your fields aren't
subject to mathematical operations or other transformations/selections.

Diez
Apr 23 '06 #4
And how im supposed to assign data to a specific hex?

Apr 23 '06 #5
Gaz schrieb:
And how im supposed to assign data to a specific hex?

How would you have done it using numarray? Accessing a specific field is
done using slicing:

fields[x][y].property = value

Diez
Apr 23 '06 #6
Diez B. Roggisch schrieb:
Gaz schrieb:
And how im supposed to assign data to a specific hex?

How would you have done it using numarray? Accessing a specific field is
done using slicing:

The term slicing is of course wrong here - it's called array index access.

Diez
Apr 23 '06 #7

### This discussion thread is closed

Replies have been disabled for this discussion.