使用索引列表

时间:2017-08-28 23:56:02

标签: python numpy cython slice

我确信这是重复的,但我真的无法在其他地方找到答案。

我的主要问题是我在代码中使用了numpy布尔索引,并且我正在优化它。

我做的事情如下:

y_ind = ~isnan(y)
otheThing = y[t,y_ind[t,:]]

我在otherThing中保存此切片的原因是因为我将它用于多次计算,因此我每次都避免重复它。

我的解决方案是为np.ndarrayy使用内存视图而不是otherThing

问题是布尔索引在cython中不起作用,因此我试图用整数列表对其进行切片。就像我们在numpy中所做的那样,例如:

x = np.random.randn(5,5)

array([[-0.56313056, -1.27834803, -0.30052179, -2.00063006, -2.05059544],
       [-0.44563071, -0.63580159, -0.67538499, -0.9192516 ,  0.49663121],
       [ 2.11943794, -0.51746142, -0.80092609, -0.89391932,  1.91359607],
       [ 0.52593344, -0.59931707,  0.78093441, -1.62449658, -1.65887717],
       [-0.46422764,  0.96595406, -0.47142008, -0.28886925, -1.86674776]])

x[2,[1,2]]

array([-0.51746142, -0.80092609])

当我们尝试这样做时会发生什么:

cdef np.ndarray[np.double_t,ndim=2] a = np.random.randn(n,n)
cdef double[:,:] a_mv = a
print(np.array(a_mv[5,(1,3)]))

.pyx:30:27: Invalid index for memoryview specified, type (long, long)
In [22]:

有可能吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以使用.base从内存视图中获取基础numpy数组,这样就可以了

otheThing = y.base[t,y_ind[t,:]]

(同样适用于“整数索引列表”)。

Cython内存视图在如何索引它们方面受到很大限制 - 它实际上只是整数和切片。它们被设计成一种快速访问内存的方式,而不是一个功能齐全的数组类。

当以这种方式切片时,不可能从Cython中获得加速,所以如果你正在使用memoryview进行所有操作,那么输入它就没有任何好处 - 只需将它保留为无类型的Python对象。 (当然,你可能事先做了一些有用的事情)

相关问题