我确信这是重复的,但我真的无法在其他地方找到答案。
我的主要问题是我在代码中使用了numpy布尔索引,并且我正在优化它。
我做的事情如下:
y_ind = ~isnan(y)
otheThing = y[t,y_ind[t,:]]
我在otherThing
中保存此切片的原因是因为我将它用于多次计算,因此我每次都避免重复它。
我的解决方案是为np.ndarray
和y
使用内存视图而不是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]:
有可能吗?有更好的方法吗?
答案 0 :(得分:2)
您可以使用.base
从内存视图中获取基础numpy数组,这样就可以了
otheThing = y.base[t,y_ind[t,:]]
(同样适用于“整数索引列表”)。
Cython内存视图在如何索引它们方面受到很大限制 - 它实际上只是整数和切片。它们被设计成一种快速访问内存的方式,而不是一个功能齐全的数组类。
当以这种方式切片时,不可能从Cython中获得加速,所以如果你正在使用memoryview进行所有操作,那么输入它就没有任何好处 - 只需将它保留为无类型的Python对象。 (当然,你可能事先做了一些有用的事情)