【问题标题】:Substitute elements of a matrix at specific coordinates in python在python中的特定坐标处替换矩阵的元素
【发布时间】:2014-09-03 12:35:30
【问题描述】:

我正在尝试解决一个“非常简单”的问题。在 Python 中不是那么简单。给定一个大矩阵 A 和另一个较小的矩阵 B,我想用 B 替换 A 的某些元素。 在 Matlab 中是这样的:

Given A, row_coord = [1,5,6] col_coord = [2,4], and a matrix B of size(3X2), A[row_coord, col_coord] = B

在 Python 中,我尝试使用 itertools 中的 product(row_coord, col_coord) 来生成需要在 A 中访问的所有索引的集合,但它不起作用。所有关于子矩阵替换的示例都参考了逐块 row_coord = col_coord 示例。除了 http://comments.gmane.org/gmane.comp.python.numeric.general/11912 之外,没有什么具体的东西似乎与我面临的问题有关,并且链接中的代码不起作用。

注意:我知道我可以通过双 for 循环来实现我需要的东西,但是在我的数据上,这样的循环会使一次迭代的运行时间增加 9 秒,我正在寻找一种更快的方法来实现这一点。

任何帮助将不胜感激。

【问题讨论】:

  • 您能提供一些示例矩阵和向量吗?它们不必非常大,足以进行测试。
  • 是的,当然: A = np.zeros([20,20]) col_coord = [0,1,3] row_coord = [1,2] B = 1 (让我们设置 B 为持续的)。解决问题的简单方法是: for a in row_coord: for b in col_coord: A[row_coord[a],col_coord[b]] = 1 但我想通过某种方式使用 intertools 实用程序使其更快.. . 提前致谢:-(

标签: python performance substitution submatrix


【解决方案1】:

假设您使用的是 numpy 数组,那么(在您的 B 是标量的情况下)以下代码应该可以将所选元素分配给 B 的值。

itertools.product 将创建所有坐标对,然后我们将其转换为 numpy 数组并用于索引您的原始数组:

import numpy as np
from itertools import product

A = np.zeros([20,20])

col_coord = [0,1,3] 
row_coord = [1,2] 

coords = np.array(list(product(row_coord, col_coord)))

B = 1

A[coords[:,0], coords[:,1]] = B

我使用this excellent answer by unutbu 来确定如何进行索引。

【讨论】:

  • 非常感谢!它按需要工作。我直接使用了 A[product(row_coord, col_coord)] 而没有投射到列表和 np.array 中,它给了我 Traceback(最近一次调用最后):IndexError: index must be an int or a sequence
  • 很高兴我能帮上忙 :) 如果你觉得我的回答对你有帮助,你可以Accept my Answer
猜你喜欢
  • 1970-01-01
  • 2014-02-28
  • 1970-01-01
  • 2014-11-29
  • 2012-11-11
  • 1970-01-01
  • 2017-05-09
  • 2016-11-13
  • 2021-12-04
相关资源
最近更新 更多