访问矩阵元素

时间:2018-03-20 18:51:59

标签: python numpy matrix

我习惯于在IDLE工作,但建议改用PyCharm。

由于我已经习惯了,我对访问矩阵元素有疑问。

我从用户那里得到不同的字符串输入并用它们填充矩阵;

from numpy import *

row=int(input())
col=int(input())

m=range(row*col)
m=reshape(m,(row,col))

for i in range(0,row):
    for j in range(0,col):
        el=int(input())
        m[i][j]=el

PyCharm告诉我的是什么:

Class' ndarray'没有定义' getitem ',所以' []'运算符不能在其实例上使用较少... 此检查会检测应该解决的名称,但不要检查。由于动态调度和鸭子打字,这在有限但有用的情况下是可能的。顶级和类级别项比实例项更好。

有人可以向我解释如何更改/修复此问题吗?

3 个答案:

答案 0 :(得分:1)

试试这个:

from numpy import np
row=int(input())
col=int(input())
m = []
for i in range(0,row):
    for j in range(0,col):
        el=int(input())
        m.append(el)
m=np.reshape(m,(row,col))

答案 1 :(得分:1)

您在Python中使用vanilla range对象。看起来您想要使用numpy.arange操作,而不是为您创建NumPy数组。 range并未向您提供numpy.arange所做的事情。

您需要更改该语句以使用arange

m=arange(row*col)

PyCharm可能为您提供该错误的原因是因为您隐式地从一种类型转换为另一种类型。这是由于它们的type hinting机制,因此在使用arange生成数组时立即生成预期输出是一种好习惯。

然而,这是非常多余的,因为您正在创建一个线性增加的row x col 2D数组,但最终还是会替换所有元素。考虑使用所需大小的numpy.zeros预先分配矩阵:

m = zeros((row, col))

此外,执行此操作非常糟糕:from numpy import *。这是因为您可能正在导入其他可以在包之间共享相同功能名称的包。除非您完全知道执行上述导入方式不会产生任何冲突,否则我不建议您这样做。相反,使用别名np导入NumPy,因为很多人这样做:

import numpy as np

之后,通过访问np来调用任何NumPy函数:

import numpy as np

row=int(input())
col=int(input())

m=np.range(row*col)
m=np.reshape(m,(row,col))
# or:
# m = np.zeros((row, col))

for i in range(0,row):
    for j in range(0,col):
        el=int(input())
        m[i][j]=el

答案 2 :(得分:1)

您的代码在IDLE和In [178]: row=3 ...: col=2 ...: ...: m=range(row*col) ...: m=np.reshape(m,(row,col)) ...: ...: for i in range(0,row): ...: for j in range(0,col): ...: el=int(input()) ...: m[i][j]=el ...: 1 2 3 4 5 6 In [179]: m Out[179]: array([[1, 2], [3, 4], [5, 6]])

中有效
pycharm

如果numpy反对,那是因为它看起来和语法一样多。我没有使用它,因此无法说明它处理np.arange(row*col).reshape(row,col)构造的效果如何。

我会使用m生成range,但您对reshapem = np.zeros((row,col),int)的使用也可以。实际上,由于您要填写用户输入的所有值,np.append也可以正常工作。

像这样的迭代输入是缓慢而笨拙的,但至少你并没有尝试使用m[i][j] = e1 # works m[i, j] = e1 # better

双索引可能是pycharm的一个问题。

pycharm

我不知道为什么In [184]: m.__getitem__ Out[184]: <method-wrapper '__getitem__' of numpy.ndarray object at 0x7fe7e883e350> 抱怨“&#39; ndarray&#39;没有定义&#39; getitem&#39;。

pycharm

可能只是[i][j]反对[i,j],但原因相当复杂。我尝试{{1}}语法,看看投诉是否消失。