我有一个涉及非常稀疏的大型n维数组的应用程序.scipy.sparse有一个有用的'矢量化获取和设置'功能,因此可以使用Cython快速填充稀疏矩阵.
当然,scipy包不能处理n维.我发现有两个包在python sparray和.d中进行n维稀疏数组ndsparse.然而,它似乎既没有矢量化的获取和设置功能.
所以我需要:
为了我的目的,我认为将n维坐标映射回1或2维可能有效.更好的是有一个dict等价物,我可以在Cython循环内快速访问.我认为这排除了python dict.
想知道是否有人可以给我一个如何在Cython中使用c ++地图对象的例子?
为了在cython中获得快速划分,我可以使用编译器指令
@cython.cdivision(True)
Run Code Online (Sandbox Code Playgroud)
这是有效的,因为得到的c代码没有零分割检查.但是由于某些原因,它实际上使我的代码变慢.这是一个例子:
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
@cython.cdivision(True)
def example1(double[:] xi, double[:] a, double[:] b, int D):
cdef int k
cdef double[:] x = np.zeros(D)
for k in range(D):
x[k] = (xi[k] - a[k]) / (b[k] - a[k])
return x
@cython.boundscheck(False)
@cython.wraparound(False)
@cython.nonecheck(False)
def example2(double[:] xi, double[:] a, double[:] b, int D):
cdef int k
cdef double[:] x = np.zeros(D)
for k in range(D):
x[k] = (xi[k] - a[k]) / (b[k] - a[k])
return x
def test_division(self):
D = 10000
x …Run Code Online (Sandbox Code Playgroud) 我想从采样数据构建网格.我可以使用机器学习 - 聚类算法,如k-means,但我想限制中心大致均匀分布.
我想出了一种使用scikit-learn最近邻搜索的方法:随机选择一个点,删除半径为r的所有点然后重复.这很好用,但想知道是否有人有更好(更快)的方法.
在回应评论时,我尝试了两种替代方法,一种方法变得慢得多,另一种方法大致相同......
方法0(我的第一次尝试):
def get_centers0(X, r):
N = X.shape[0]
D = X.shape[1]
grid = np.zeros([0,D])
nearest = near.NearestNeighbors(radius = r, algorithm = 'auto')
while N > 0:
nearest.fit(X)
x = X[int(random()*N), :]
_, del_x = nearest.radius_neighbors(x)
X = np.delete(X, del_x[0], axis = 0)
grid = np.vstack([grid, x])
N = X.shape[0]
return grid
Run Code Online (Sandbox Code Playgroud)
方法1(使用预先计算的图表):
def get_centers1(X, r):
N = X.shape[0]
D = X.shape[1]
grid = np.zeros([0,D])
nearest = near.NearestNeighbors(radius = r, algorithm = 'auto')
nearest.fit(X)
graph = nearest.radius_neighbors_graph(X) …Run Code Online (Sandbox Code Playgroud)