numpy reference array
Is it possible to create a numpy array which points to the same data in a different numpy array (but in different order etc)?
For example:
Code:  import numpy as np a = np.arange(10) ids = np.array([0,0,5,5,9,9,1,1]) b = a[ids] a[0] = 1 b[0] #should be 1 if b[0] referenced the same data as a[0] 0 
ctypes almost does it for me, but the access is inconvenient. I would like to access b as a regular numpy array:
Code:  import numpy as np import ctypes a = np.arange(10) ids = np.array([0,0,5,5,9,9,1,1]) b = [a[id:id+1].ctypes.data_as(ctypes.POINTER(ctypes.c_long)) for id in ids] a[0] = 1 b[0][0] #access is inconvenient 1  Some more information: I've written a finiteelement code, and I'm working on optimizing the python implementation. Profiling shows the slowest operation is the recreation of an array that extracts edge degrees of freedom from the volume of the element (similar to b above). So, I'm trying to avoid copying the data every time, and just setting up 'b' once. The ctypes solution is suboptimal since my code is mostly vectorized, that is, later I'd like to something like
Code:  c[ids] = b[ids] + d[ids] 
where c, and d are the same shape as b but contain different data.
Any thoughts? If it's not possible that will save me time searching.
On Wed, Mar 13, 2013 at 6:56 AM, Matt U mpuecker@mit.edu wrote:
Is it possible to create a numpy array which points to the same data in a different numpy array (but in different order etc)?
You can do this (easily), but only if the "different order" can be defined in terms of strides. A simple example is a transpose:
In [3]: a = np.arange(12).reshape((3,4))
In [4]: a Out[4]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]])
In [5]: b = a.T
In [6]: b Out[6]: array([[ 0, 4, 8], [ 1, 5, 9], [ 2, 6, 10], [ 3, 7, 11]])
# b is the transpose of a # but a view on the same data block: # change a: In [7]: a[2,1] = 44
In [8]: a Out[8]: array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 44, 10, 11]])
# b is changed, too. In [9]: b Out[9]: array([[ 0, 4, 8], [ 1, 5, 44], [ 2, 6, 10], [ 3, 7, 11]])
check out "stride tricks" for clever things you can do.
But numpy does require that the data in your array be a contiguous block, in order, so you can't arbitrarily rearrange it while keeping a view.
HTH, Chris
Chris Barker  NOAA Federal <chris.barker <at> noaa.gov> writes:
check out "stride tricks" for clever things you can do.
But numpy does require that the data in your array be a contiguous block, in order, so you can't arbitrarily rearrange it while keeping a view.
HTH, Chris
Hi Chris, Thanks for the reply, you've just saved me a lot of time. I did run across 'views' but it looked like I couldn't have my data arbitrarily arranged. Thank you for confirming that. Unfortunately my desired view does not fit a neat striding pattern. Cheers, Matt
participants (2)

Chris Barker  NOAA Federal

Matt U