我习惯于在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 ',所以' []'运算符不能在其实例上使用较少... 此检查会检测应该解决的名称,但不要检查。由于动态调度和鸭子打字,这在有限但有用的情况下是可能的。顶级和类级别项比实例项更好。
有人可以向我解释如何更改/修复此问题吗?
答案 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
,但您对reshape
和m = 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}}语法,看看投诉是否消失。