Custom data type in a matrix.

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Gaz

    #1

    Custom data type in a matrix.

    Hi guys. I've been lookig for this in the numpy pdf manual, in this
    group and on google, but i could not get an answer...

    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.

  • Gaz

    #2
    Re: Custom data type in a matrix.

    BTW, i tried the "classe Thinge(): pass" but does not qualify as "data
    type" for a numpy array.

    Comment

    • Robert Kern

      #3
      Re: Custom data type in a matrix.

      Gaz wrote:[color=blue]
      > Hi guys. I've been lookig for this in the numpy pdf manual, in this
      > group and on google, but i could not get an answer...[/color]

      You will probably want to look or ask on the numpy list, too.


      [color=blue]
      > 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[/color]

      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):



      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__(s elf, **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
      robert.kern@gma il.com

      "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

      Comment

      • Diez B. Roggisch

        #4
        Re: Custom data type in a matrix.

        Gaz schrieb:[color=blue]
        > Hi guys. I've been lookig for this in the numpy pdf manual, in this
        > group and on google, but i could not get an answer...
        >
        > 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.[/color]

        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_ty pe = "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

        Comment

        • Gaz

          #5
          Re: Custom data type in a matrix.

          And how im supposed to assign data to a specific hex?

          Comment

          • Diez B. Roggisch

            #6
            Re: Custom data type in a matrix.

            Gaz schrieb:[color=blue]
            > And how im supposed to assign data to a specific hex?[/color]

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

            fields[x][y].property = value

            Diez

            Comment

            • Diez B. Roggisch

              #7
              Re: Custom data type in a matrix.

              Diez B. Roggisch schrieb:[color=blue]
              > Gaz schrieb:[color=green]
              >> And how im supposed to assign data to a specific hex?[/color]
              >
              > How would you have done it using numarray? Accessing a specific field is
              > done using slicing:[/color]

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

              Diez

              Comment

              Working...