Matrix cython搜索矩阵中的值
我有一个6x3矩阵。第1列和第2列是索引,第3列是值。 问题是如何快速查找列1和列2给定的值?例如,给定列1=1和列2=3,我希望返回0.420339974 我尝试循环查找每一列,但如果有很多行,则速度会很慢 Jason 简短回答 您可以使用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
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)