我想了解x[i,j]和x[i][j]之间的区别,其中x是一个矩阵
x = np.zeros((N,M))在做研究时,我发现的答案总是关于2D维数的数组,但在我的例子中,我有一个具有两个索引的矩阵来处理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(用户)的数量。
发布于 2018-09-04 23:30:28
对于2d数组的简单索引,两种形式都有效:
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__的调用。
发布于 2018-09-04 18:47:20
根据Numpy v1.15.1 manual,它们是等效的
注释在Python中,x(exp1,exp2,...,expN)等同于xexp1,exp2,...,expN;后者只是前者的语法糖。
https://stackoverflow.com/questions/52164376
复制相似问题