Python 索引超出边界的Numpy 2D数组索引
我在以下代码中发现了一个严重的瓶颈:Python 索引超出边界的Numpy 2D数组索引,python,numpy,optimization,matrix-indexing,Python,Numpy,Optimization,Matrix Indexing,我在以下代码中发现了一个严重的瓶颈: def get_value(matrix, index): if (index[0] >= 0 and index[1] >= 0 and index[0] < matrix.shape[0] and index[1] < matrix.shape[1]): return matrix[index[0], index[1]] return DEFAULT_VAL 我一直
def get_value(matrix, index):
if (index[0] >= 0 and index[1] >= 0 and
index[0] < matrix.shape[0] and
index[1] < matrix.shape[1]):
return matrix[index[0], index[1]]
return DEFAULT_VAL
我一直在想一种利用numpy来完成这项任务的方法,但我还没有找到一种方法
有办法做到这一点吗?您显示的代码
def get_values(matrix, indices):
return matrix[indices[:,0], indices[:,1]]
如果索引
是一个具有两个值的元组,则是您所能做的最好的
您应该查看调用上述方法的最佳方式。我建议如果可以的话,与其用一个元组调用get\u values
,不如用大量这样的元组调用。然后,您至少可以尝试编写一个向量化版本的get\u values
。对于单元组,这里没有任何东西可以矢量化
矢量化方法
假设您的索引
是一个大小为nx2
的numpy数组,其中n
是索引的数量,2
对应于两个维度,那么您可以使用
index = np.random.randint(0,500, size=(10000,2))
matrix = np.random.randn(1000,1000)
def get_value(matrix, index, default_value=-1):
result = np.zeros(len(index))+default_value
mask = (index[:,0] < matrix.shape[0]) & (index[:,1] < matrix.shape[1])
valid = index[mask]
result[mask] = matrix[valid[:, 0], valid[:, 1]]
return result
assert np.all(get_value(matrix, np.array(([0,1001],[1001,1001]))) == -1)
这就是我的意思。我使用元组数组调用get_values方法。但我不知道如何实施。原始的get_值可以处理单个元组,而get_值应该处理元组数组。向量化方法几乎就是我想要的。问题是当索引无效时,我需要返回一个默认值,而不是访问矩阵。这就是我正在努力解决的问题。请看前面的get_value实现。谢谢,这是不对的。在您的解决方案中,您可以为一维索引数组返回二维值数组。对于索引数组中的每个元组,应该有一个值。因此,对于形状(10000,2)的索引,结果数组应该是形状(10000,)。这正是我想要的!非常感谢。工作起来很有魅力。
index = np.random.randint(0,500, size=(10000,2))
matrix = np.random.randn(1000,1000)
def get_value(matrix, index, default_value=-1):
result = np.zeros(len(index))+default_value
mask = (index[:,0] < matrix.shape[0]) & (index[:,1] < matrix.shape[1])
valid = index[mask]
result[mask] = matrix[valid[:, 0], valid[:, 1]]
return result
assert np.all(get_value(matrix, np.array(([0,1001],[1001,1001]))) == -1)
%timeit get_value(matrix, index, -1): 1 loop, best of 3: 264 ms per loop