Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 索引超出边界的Numpy 2D数组索引_Python_Numpy_Optimization_Matrix Indexing - Fatal编程技术网

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