首页 > 解决方案 > python 两种形式的矩阵x[i,j]和x[i][j]的区别

问题描述

我想了解x 是矩阵之间的区别x[i,j]和位置x[i][j]

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]为了更清楚每个 i(基站)有很多 j(用户)

标签: pythonnumpymatrix

解决方案


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

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__


推荐阅读