Skip to main content
 首页 » 编程设计

矩阵 x[i,j] 和 x[i][j] 两种形式的python区别

2025年05月04日10xing901022

我想了解 x[i,j] 和 x[i][j] 之间的区别,其中 x 是一个矩阵

x = np.zeros((N,M)) 

我在做研究时发现的答案总是关于二维数组,但在我的例子中,我有一个带有两个索引的矩阵来处理 i 和 j,我需要用 for 循环根据索引操作矩阵.

    for i in range(1,N+1): 
        for j in range(1,M+1): 
            x[i-1][j-1]=random.uniform(5,10) 

所以你能帮我理解 x[i,j] 和 x[i][j] 之间的区别吗?站)有j个(用户)

请您参考如下方法:

对于二维数组的简单索引,两种形式都有效:

In [28]: x = np.arange(6).reshape(2,3) 
In [29]: x 
Out[29]:  
array([[0, 1, 2], 
       [3, 4, 5]]) 
In [30]: x[1,2] 
Out[30]: 5 
In [31]: x[1][2] 
Out[31]: 5 

对于 np.matrix(您可能无论如何都不应该使用它)它们不是:

In [32]: X = np.matrix(x) 
In [33]: X 
Out[33]:  
matrix([[0, 1, 2], 
        [3, 4, 5]]) 
In [34]: X[1,2] 
Out[34]: 5 
In [35]: X[1][2] 
... 
IndexError: index 2 is out of bounds for axis 0 with size 1 

这两种形式在句法上并不相同。 [1][2] 首先用 1 索引,然后用 2 索引结果。这与使用两个参数一次索引不同。

In [36]: x[1] 
Out[36]: array([3, 4, 5])      # (3,) shape 
In [37]: X[1] 
Out[37]: matrix([[3, 4, 5]])   # (1,3) shape 

错误的产生是因为 np.matrix 返回了另一个 np.matrix。因此下一个 [2] 索引将再次索引第一个维度。

x[1] 是 x[1,:] 的缩写,即对第一个维度进行索引,并将其余所有维度切片(或 X[1,...] 以允许 3d 和更高)。所以 x[1][2] 确实是

temp = x[1,:] 
temp[2] 

或者对于矩阵情况:

temp = X[1,:] 
temp[2,:] 

也就是说,就是2次索引操作。这是一个 Python 表达式,而不是特定的 numpy 用法。

当我们使用列表或切片进行索引时,这两种形式之间的差异变得更加显着,尤其是在设置值时。

我鼓励初学者使用x[i,j] 形式。不要使用 x[1][2] 除非你真的明白发生了什么。

如果需要,我可以了解如何将索引转换为对 __setitem__ 和 __getitem__ 的调用。