我有一个矩阵
import numpy as np
matrix = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
我想用它来表示一个离散的二维物理空间,在笛卡尔坐标系中。例如,当访问值时,我会得到matrix[0,0] = 7
,matrix[1,2] = 6
,matrix[3,3] = 3
。
我怎么能做到呢?我尝试过使用np.meshgrid
,但就我设法实现它而言,结果并不是我要找的。我所寻找的可以通过转置矩阵每次我试图访问一个值,但我想一种方法,只是改变索引的矩阵直接完成。
谢谢!
3条答案
按热度按时间zpf6vheq1#
您可以使用
np.flip
的矩阵视图:使用方法:
也可以使用
np.pad
:使用方法:
您还可以Subclassing ndarray和覆盖
__getitem__
和__setitem__
方法。ibps3vxo2#
我将为您的问题提供解决方案。尽管我会解释为什么这种方法非常笨拙,并且会在稍后的实验中导致问题。我建议看看meshgrid。Here是一个简单的例子,如何使用meshgrid在2D笛卡尔平面上执行计算。我认为这是标准和直接的方式,因此是特权的方式。
解决方案
在此之前,我将介绍一些变量。表示
x_values = np.arange(-2, 2+1)
,y_values = np.arrange(-1, 1+1)
之间的笛卡尔平面的矩阵:我们将该矩阵的索引表示为
i
和j
。我们还将注意到x
和y
作为我们的笛卡尔指数。您需要的是从(x, y)
到(i, j)
的Map。例如,从(2, 1)
开始,您需要左上角的值与矩阵索引(0, 4)
。最后引入的变量是
i_origin
和j_origin
。这些变量是i
和j
,它们是平面(0, 0)
的笛卡尔原点。我们可以做i_origin = matrix.shape[0] // 2
和j_origin = matrix.shape[1] // 2
。我们将使用i_origin
作为行索引的偏移量- vertical -所以对于y
和j_origin
,对于x
如果你拿着铅笔和纸,我想我们可以同意:
因此,我们可以编写两个短函数:
如果你愿意,我们甚至可以让一个函数有一个元组(i,j):
我们可以简单地写:
问题
好吧,我们可以说我们有你的解决方案,但这种方法带来了一系列问题:
CartesianMatrix
-例如-并将我们的函数放在它的方法中。您可以从ndarray
继承或组合它。这可能是可行的,但需要更多的工作。(注:实际上会很有趣)一般来说,您必须将新类的接口设置为与ndarray相同才不会有问题。否则,你将不得不为你遇到的每个问题找到一个解决方案,因为你没有通过标准的方式访问/设置索引。
注意:对象的接口是对象必须表现的方式。
unguejic3#
考虑到
numpy.ndarray.__getitem__
不可写的事实,建议以另一种方式访问值。numpy.flip
函数可用于沿着指定轴翻转或反转数组中元素的顺序。这在各种数据处理和分析任务中可能是有用的,例如图像处理、信号处理和数据操纵。我想为我之前的错误回答向你道歉。这个问题的最佳解决方案是使用numpy.flip函数。