Matrix cython搜索矩阵中的值

Matrix cython搜索矩阵中的值,matrix,cython,Matrix,Cython,我有一个6x3矩阵。第1列和第2列是索引,第3列是值。 问题是如何快速查找列1和列2给定的值?例如,给定列1=1和列2=3,我希望返回0.420339974 我尝试循环查找每一列,但如果有很多行,则速度会很慢 Jason 简短回答 您可以使用np.where如下和np.logical\u和如下: import numpy as np cimport numpy as np x = np.array( [[1,1,0.293729457], [1,2,0.414213648], [1,3,0.4

我有一个6x3矩阵。第1列和第2列是索引,第3列是值。 问题是如何快速查找列1和列2给定的值?例如,给定列1=1和列2=3,我希望返回0.420339974

我尝试循环查找每一列,但如果有很多行,则速度会很慢

Jason

简短回答 您可以使用
np.where
如下和
np.logical\u和
如下:

import numpy as np
cimport numpy as np

x = np.array(
[[1,1,0.293729457],
[1,2,0.414213648],
[1,3,0.420339974],
[2,1,0.394448377],
[2,2,0.550755237],
[2,3,0.876993966]
]
)
长话短说 为了说明一点,
x[:,0]==1
x[:,1]==3
返回布尔数组,大小等于
x
的长度。首先,让我们定义两个变量来存储条件:

In [10]: x[np.where(np.logical_and(x[:,0]==1,x[:,1]==3))][0][2]
Out[10]: 0.42033997400000001
您不能使用Python的内置
,如
a和b
中所述,因为它将首先尝试将其参数转换为布尔值:

In [12]: a = x[:,0]==1
In [13]: b = x[:,1]==3
其中
以单个数组作为参数调用,相当于numpy的
非零

In [16]: np.logical_and(a,b)
Out[16]: array([False, False,  True, False, False, False], dtype=bool)
In [17]: np.where(np.logical_and(a,b))
Out[17]: (array([2]),)
最后,看起来您的数据可以更具逻辑性地组织起来(而且更紧凑),只作为一个二维值矩阵:

In [18]: np.nonzero(np.logical_and(a,b))
Out[18]: (array([2]),)
那么,尽管从基于1的索引切换到基于0的索引,您的查找仍然是微不足道的:

In [25]: M = 2
In [26]: N = 3
In [27]: data = np.zeros((M,N))
In [28]: for datum in x:
data[datum[0]-1,datum[1]-1]=datum[2]

In [30]: data
Out[30]: 
array([[ 0.29372946,  0.41421365,  0.42033997],
       [ 0.39444838,  0.55075524,  0.87699397]])

-Ravi

在深入研究libcpp之后,我使用了以下方法

In [31]: data[0][2]
Out[31]: 0.42033997400000001

它的工作原理与2d矩阵查找类似。

它实际上取决于您的用例和数据集的大小。如果您只需要查询一次数据集,恐怕最终无法避免在所有行上循环

但是,如果您能够负担一些计算开销来预处理数据集,以便快速执行多个后续查询,那么会想到几种方法

  • 最简单的方法可能是简单地将数据复制到2D数组,其中索引(
    i,j
    )直接对应于原始数组中具有这些索引的行。这甚至可以通过一个简单的
    ndarray来完成。如果原始数据已排序且同质化,则重塑
    
    
  • 更多信息,您可以了解PyTables如何对大型数据集进行高效查询。一般来说,您可以创建所需列的索引,以便更高效地执行查询,这与关系数据库相同

有许多事情可以尝试。不过,首先,您需要决定要使用的算法,然后再看看Cython是否值得用于优化它。

谢谢您的评论。在深入研究libcpp之后,我使用libcpp.map cimport map import numpy作为np cimport numpy作为np x=np.array([[1,1,0.293729457],[1,2,0.414213648],[1,3,0.420339974],[2,1,0.394448377],[2,2,0.550755237],[2,3,0.876993966])定义F(int c1,int c2,x=x):cdef map[int,map[int,float]]my_map cdef int i for i in xrange(x.shape[0]):my_map[x[i,0]][x[i,1]]=x[i,2]返回my_map[c1][c2]打印F(1,2)其工作原理与2d矩阵查找类似。
In [31]: data[0][2]
Out[31]: 0.42033997400000001
from libcpp.map cimport map

import numpy as np
cimport numpy as np

x = np.array(
[[1,1,0.293729457],
[1,2,0.414213648],
[1,3,0.420339974],
[2,1,0.394448377],
[2,2,0.550755237],
[2,3,0.876993966]
]
)


def F(int c1, int c2, x = x):
    cdef map[int, map[int, float]] my_map
    cdef int i
    for i in xrange(x.shape[0]):
        my_map[x[i,0]][x[i,1]] = x[i,2]

    return my_map[c1][c2]

print F(1,2)