【问题标题】:Accessing matrix elements访问矩阵元素
【发布时间】:2018-03-20 18:51:59
【问题描述】:

我习惯了在 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 告诉我什么:

类 'ndarray' 没有定义 'getitem',因此 '[]' 运算符不能在其实例上使用... 此检查检测应解析但未解析的名称。由于动态调度和鸭子类型,这在有限但有用的情况下是可能的。顶级项和类级项的支持优于实例项。

谁能向我解释一下如何更改/解决这个问题?

【问题讨论】:

  • 相信 PyCharm。它比 IDLE、你或我更聪明。
  • 您能否提供此问题出现的确切位置的屏幕截图,因为我没有遇到同样的问题(尽管我以前见过)...
  • 我确实相信,我只是不想被我在 IDLE 中永远不会遇到的警告/错误轰炸。不过,我看到 PyCharm 有它的优势,所以我想我会随着时间的推移学会利用它们。

标签: python numpy matrix


【解决方案1】:

您正在 Python 中使用原版 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

【讨论】:

  • 谢谢,我喜欢创建一个零矩阵的想法!
  • 有趣的是,我收到“未解决的引用‘零’”警告..​​.我想知道 PyCharm 是否存在导入问题,因为我只获得了 numpy 的一半功能跨度>
  • from numpy import * 是非常糟糕的做法。最好使用别名:import numpy as np 导入包,然后使用 np 访问 NumPy 的功能。
  • 我现在得到“找不到参考‘零’”。再次尝试导入 numpy 并确认已导入
  • 运行成功了!
【解决方案2】:

您的代码在 IDLE 和 ipython 中有效:

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。

双索引可能是 pycharm 的问题。

m[i][j] = e1    # works
m[i, j] = e1    # better

我不知道为什么 pycharm 抱怨 `'ndarray' 没有定义 'getitem'。

In [184]: m.__getitem__
Out[184]: <method-wrapper '__getitem__' of numpy.ndarray object at 0x7fe7e883e350>

可能只是pycharm 反对[i][j],但出于相当复杂的原因。我会尝试[i,j] 语法,看看投诉是否消失。

【讨论】:

  • 我尝试了 [i,j] 但很遗憾,它不起作用。感谢您在 IDLE 中查看它,但我不得不承认我错过了使用它。
【解决方案3】:

试试这个:

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))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-06
    • 2013-02-13
    相关资源
    最近更新 更多