我目前有以下的cython函数,用于修改一个填充了零的numpy数组的条目,以求和非零值。在返回数组之前,我想将其修剪并删除所有非零条目。目前,我使用numpy函数 myarray = myarray[~np.all(myarray == 0, axis=1)]
来做到这一点。我想知道是否有(通常情况下)通过使用Cython/C函数而不是依赖于python/numpy来更快地完成此操作的方法。这是我的脚本中仅存的最后几个pythonic交互部分之一(通过使用%%cython -a
进行检查)。但我真的不知道如何解决这个问题。通常情况下,我不事先知道最终数组中非零元素的数量。
cdef func():
np.ndarray[np.float64_t, ndim=2] myarray = np.zeros((lenpropen, 6))
"""
computations
"""
myarray = myarray[~np.all(myarray == 0, axis=1)]
return myarray
感谢@Jérôme Richard的评论。基于这个(如果我的理解是正确的),我尝试实现删除-移除惯用法。以下是示例代码。
myarray = np.zeros((5000,6))
myarray[2] = [1,1,1,1,1,1]
@cython.boundscheck(False) # Deactivate bounds checking
@cython.wraparound(False) # Deactivate negative indexing.
@cython.cdivision(True) # Deactivate division by 0 checking.
cdef erase_remove( np.ndarray[np.float64_t, ndim=2] myarray):
cdef int idx
cdef int cursor = 0
cdef int length_arr = 5000
for idx in range(5000):
if myarray[idx,0]!=0 and myarray[idx,1]!=0 and myarray[idx,2]!=0 and myarray[idx,3]!=0 and myarray[idx,4]!=0 and myarray[idx,5]!=0:
myarray[cursor,0] = myarray[idx,0]
myarray[cursor,1] = myarray[idx,1]
myarray[cursor,2] = myarray[idx,2]
myarray[cursor,3] = myarray[idx,3]
myarray[cursor,4] = myarray[idx,4]
myarray[cursor,5] = myarray[idx,5]
cursor = cursor +1
else:
continue
return myarray[0:cursor]
start = timer()
myarray= erase_remove(myarray)
end = timer()
print("final", myarray)
print("time", end-start)
这将产生输出结果。
final [[1. 1. 1. 1. 1. 1.]]
time 1.1235475540161133e-05
与之相比
myarray = np.zeros((5000,6))
print(myarray)
myarray[2] = [1,1,1,1,1,1]
print(myarray)
start = timer()
myarray = myarray[~np.all(myarray == 0, axis=1)]
end = timer()
print(myarray)
print("time", end-start)
生成输出的方法
[[1. 1. 1. 1. 1. 1.]]
time 0.0006445050239562988
else
+continue
。总体而言,看起来很棒 :)。 - Jérôme Richard