problems with duplicating and slicing an array

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

    #1

    problems with duplicating and slicing an array

    Hi python gurus,
    I have some questions when I'm using python numeric:

    1. When I do v = u[:, :], it seems u and v still point to the same
    memory. e.g. When I do v[1,1]=0, u[1,1] will be zero out as well.
    What's the right way to duplicate an array? Now I have to do v =
    dot(u, identity(N)), which is kind of silly.

    2. Is there a way to do Matlab style slicing? e.g. if I have
    i = array([0, 2])
    x = array([1.1, 2.2, 3.3, 4.4])
    I wish y = x(i) would give me [1.1, 3.3]
    Now I'm using map, but it gets a little annoying when there are two
    dimensions.
    Any ideas would be deeply appreciated!

    Thanks!!!

    -Y
  • Steven Bethard

    #2
    Re: problems with duplicating and slicing an array

    Yun Mao wrote:[color=blue]
    > Hi python gurus,
    > I have some questions when I'm using python numeric:
    >
    > 1. When I do v = u[:, :], it seems u and v still point to the same
    > memory. e.g. When I do v[1,1]=0, u[1,1] will be zero out as well.
    > What's the right way to duplicate an array? Now I have to do v =
    > dot(u, identity(N)), which is kind of silly.[/color]

    Hmm... I don't know Numeric, but in numarray (Numeric's replacement),
    you just call the copy method:

    py> u = na.arange(6, shape=(2, 3))
    py> v = u.copy()
    py> v[0,0] = 100
    py> u
    array([[0, 1, 2],
    [3, 4, 5]])
    py> v
    array([[100, 1, 2],
    [ 3, 4, 5]])
    [color=blue]
    > 2. Is there a way to do Matlab style slicing? e.g. if I have
    > i = array([0, 2])
    > x = array([1.1, 2.2, 3.3, 4.4])
    > I wish y = x(i) would give me [1.1, 3.3][/color]

    This also works exactly as you'd hope in numarray.

    py> i = na.array([0, 2])
    py> x = na.array([1.1, 2.2, 3.3, 4.4])
    py> x[i]
    array([ 1.1, 3.3])

    Do you have any reason that you have to use Numeric? Or can you upgrade
    to numarray?

    Steve

    Comment

    • beliavsky@aol.com

      #3
      Re: problems with duplicating and slicing an array

      Yun Mao wrote:
      [color=blue]
      >I have some questions when I'm using python numeric:[/color]
      [color=blue]
      >1. When I do v = u[:, :], it seems u and v still point to the same
      >memory. e.g. When I do v[1,1]=0, u[1,1] will be zero out as well.
      >What's the right way to duplicate an array? Now I have to do v =
      >dot(u, identity(N)), which is kind of silly.[/color]

      You can use v = 1*u or v = u.copy() to get the type of copy you want.
      [color=blue]
      >2. Is there a way to do Matlab style slicing?[/color]

      Use the take function.

      The output of the following code

      from Numeric import array,take
      a = array([1,2])
      b = a
      c = 1*a
      d = a.copy()
      a[0] = 3
      print b
      print c
      print d
      print take(a,[1,0,1])

      is

      [3 2]
      [1 2]
      [1 2]
      [2 3 2]

      Comment

      Working...