2011-11-27 28 views
1

我有一个包含复数的一维numpy数组(例如。numpy.complex64)。我需要在这个数组上创建视图,但我不知道如何创建一个视图给定一个列表或索引范围,以在视图中包含非连续项目的NumPy数组视图

>>> myArray = np.ndarray(shape=(1000,), dtype=np.complex64) 

我知道如何创建连续项的视图,例如第100个元素:

>>> myView = myArray[:100] 

当我尝试,它不可能建立在单一项目视图,像myArray的[2]因为如果我修改了这个值,它不会改变底层数组。这是确定的,但我希望有一种方法来构建由多个任意索引视图,所以这样的功能将是巨大的:

>>> myView = createView(myArray, indices=(0, 1, 6, 7, 13)) 

这将返回一个指向列表中给出的索引视图(或任何可迭代的形式),如果我更改myView,它会改变myArray像它应该。

这是可能的,还是有一个理智的解决方法? 感谢

编辑

要解释为什么我需要这样的:我想数组OpenCL设备的内存(反面)复制。我需要设备上元素的顺序不同于原始数组,而这些较短的数组将被视为向量,而矩阵乘法将在OpenCL内核中进行。如果元件没有按要求的顺序复制到设备存储器中,则不可能实现存储器合并,并且会出现显着的性能下降,更不用说在OpenCL端需要额外的逻辑了。

在我的情况下,可以用均匀间隔的视图来做到这一点,但我想知道是否有更一般的方法。如果可以完成更通用的实现,那么CPU性能下降很小。

+0

这不是真的有可能使一个不​​均匀间隔视图。但是可以以各种方式使用任意索引列表。你需要什么? –

+0

实际上我用完原始数组的所有索引一次,并且想要创建具有较短长度的多个数组,并引用原始数组。 (在我的例子中,可以用均匀间隔的视图来完成,但我想知道是否可以用更一般的方式。)我想将数据复制到OpenCL设备内存,并使用PyOpenCL InOut作为过滤数组,以更改原始数组中的正确索引。 – tamacun

回答

2

据我所知,你不能看到任意索引;只限于连续的指数或定期间隔的指数。这是因为视图底层内存中的元素必须以恒定数量的字节分隔,否则所有快速NumPy例程都不起作用。

+0

我想将“视图”复制到OpenCL设备,并对数据进行计算,所以在我的情况下,代码的CPU端不需要进行完美的优化。正如Alexandru所建议的那样,我会研究过滤器或口罩来达到这个目的。 – tamacun

0

据我所知,在ndarray上的视图是这样产生的:myArray.view(dtype)。这里是文档:http://docs.scipy.org/doc/numpy/reference/generated/numpy.ndarray.view.html

它不回答你的不连续的项目问题,但我认为这是一个好的开始。

我认为你应该用你的索引创建另一个过滤数组。因为我的观点并不是真的需要过滤,而是用相同数据的不同表示。

0

下面演示了OP的要求:

>>> a = numpy.array(xrange(103,114)) 
>>> a 
array([103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113]) 
>>> view = numpy.array([2,6,7,9]) 
>>> a[view] 
array([105, 109, 110, 112]) 
>>> a[view] += 9999 
>>> a 
array([ 103, 104, 10104, 106, 107, 108, 10108, 10109, 111, 
     10111, 113])