用 python 中的坐标数组填充矩阵
Filling matrix with array of coordinates in python
我目前有 2 个数组对应坐标 (X,Y),第三个数组对应 2d 中此时的值 space。它是这样编码的,而不是矩阵,因为它是一个非常稀疏的矩阵(不是每个点都有一个值)。现在我想重建矩阵以便用 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]
我的意思是,它不可怕,但我害怕大阵。是否有一个函数将第一个和第二个输入分别作为第一个和第二个坐标,第三个输入作为这些坐标处的值?或者会有类似的东西吗?
对于你正在做的事情,你可以简单地直接使用列表(没有)循环。例子-
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
循环方法会更快。
我目前有 2 个数组对应坐标 (X,Y),第三个数组对应 2d 中此时的值 space。它是这样编码的,而不是矩阵,因为它是一个非常稀疏的矩阵(不是每个点都有一个值)。现在我想重建矩阵以便用 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]
我的意思是,它不可怕,但我害怕大阵。是否有一个函数将第一个和第二个输入分别作为第一个和第二个坐标,第三个输入作为这些坐标处的值?或者会有类似的东西吗?
对于你正在做的事情,你可以简单地直接使用列表(没有)循环。例子-
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
循环方法会更快。