【问题标题】:Filling matrix with array of coordinates in python在python中用坐标数组填充矩阵
【发布时间】:2016-01-25 02:33:58
【问题描述】:

我目前有 2 个数组对应于坐标 (X,Y) 和第三个数组对应于 2d 空间中此时的值。它是这样编码的,而不是一个矩阵,因为它是一个非常稀疏的矩阵(不是每个点都有一个值)。现在我想重建矩阵以便用 matplotlib.imshow() 绘制值。

到目前为止,我最简单的方法是执行 for 循环,如下所示:

X = [1, 1, 3, 5];
Y = [2, 2, 3, 7];
Z = [0.3, -0.5, 1, 1];
matrix = np.zeros([10,10])

for i in range(len(Z)):
    matrix[X[i],Y[i]] = Z[i]

我的意思是,这并不可怕,但我害怕大阵列。是否有一个函数可以将第一个和第二个输入分别作为第一个和第二个坐标,第三个输入作为这些坐标的值?或者会有类似的东西吗?

【问题讨论】:

  • 假设我没看错,如果你需要一种稀疏的方式来表示点,为什么不使用集合呢?如果您需要与它们关联的值,为什么不使用字典?
  • 感谢您的回复。它确实存储在字典中,但我用数组重新构建了它,因为它更易于解释。

标签: python arrays matrix matplotlib sparse-matrix


【解决方案1】:

对于您正在做的事情,您可以直接(不使用)循环使用列表。示例 -

matrix[X,Y] = Z

演示 -

In [3]: X = [1, 1, 3, 5];

In [4]: Y = [2, 2, 3, 7];

In [5]: Z = [0.3, -0.5, 1, 1];

In [6]: matrix = np.zeros([10,10])

In [7]: matrix[X,Y] = Z

In [8]: matrix
Out[8]:
array([[ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. , -0.5,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  1. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  1. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ],
       [ 0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ,  0. ]])

In [9]: matrix1 = np.zeros([10,10])

In [10]: for i in range(len(Z)):
   ....:     matrix1[X[i],Y[i]] = Z[i]

In [13]: (matrix1 == matrix).all()  #Just to show its equal to OP's `for` loop method.
Out[13]: True

计时测试 -

In [24]: X = np.arange(1000)

In [25]: Y = np.arange(1000)

In [26]: Z = np.random.rand(1000)

In [27]: %%timeit
   ....: matrix = np.zeros([1000,1000])
   ....: matrix[X,Y] = Z
   ....:
1000 loops, best of 3: 834 µs per loop

In [28]: %%timeit
   ....: matrix1 = np.zeros([1000,1000])
   ....: for i in range(len(Z)):
   ....:     matrix1[X[i],Y[i]] = Z[i]
   ....:
The slowest run took 6.47 times longer than the fastest. This could mean that an intermediate result is being cached
1000 loops, best of 3: 1.43 ms per loop

向量化的方法在处理大型数组(并且 Z 很大)时会更快。

如果 Z 很小,那么使用for 循环方法会更快。

【讨论】:

  • 我不知道为什么我认为 python 不能处理它;我什至没有尝试过。矢量化正是我想要的。谢谢
  • 很高兴能为您提供帮助! :-) 如果您觉得这个答案有帮助,我想请您接受这个答案(点击答案左侧的勾号),这将对社区有所帮助。
  • @PhC-PhD 此外,它的 numpy 可以正确处理矢量化,这不适用于普通的 python 列表。 matrix 需要是一个 numpy 数组或 numpy 矩阵才能工作。
猜你喜欢
  • 2017-09-08
  • 2021-07-29
  • 1970-01-01
  • 2021-07-11
  • 1970-01-01
  • 2019-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多