此代码的目的是使用第三列作为参数来排列行。如果我使用普通矩阵,则该程序可以正常运行,但是我需要使用numpy,因为它是更大程序的一部分。
所需的输出为:[[2,-2,7],[-1,1,4],[10,7,1]]
import numpy as np
y = np.matrix([[-1,1,4],[2,-2,7],[10,7,1]])
c = True
def OrdenaMatriz(y):
matriz = []
matriz.append(y[0])
for a in range(2):
if y[a,2] < y[a+1,2]:
matriz.insert(a,y[a+1])
else:
matriz.append(y[a+1])
return matriz
while c == True:
a = OrdenaMatriz(y)
if a == y:
c = False
print(a)
y = a
显示以下错误:
DeprecationWarning: elementwise == comparison failed; this will raise an
error in the future.
if a == y:
Traceback (most recent call last):
File "teste.py", line 26, in <module>
a = OrdenaMatriz(y)
File "teste.py", line 19, in OrdenaMatriz
if y[a,2] < y[a+1,2]:
TypeError: list indices must be integers or slices, not tuple
答案 0 :(得分:1)
我将尽力解释您的错误和警告。
y = np.matrix([[-1,1,4],[2,-2,7],[10,7,1]])
也可能是
y = np.array([[-1,1,4],[2,-2,7],[10,7,1]])
您(尤其是初学者)不需要使用np.matrix
。 np.array()
产生常规的numpy数组对象。不建议使用np.matrix
,因为它现在并没有添加任何特殊内容。
a = OrdenaMatriz(y)
生成一个Python列表。您从[]
开始,然后插入或附加值,因此结果仍然是列表。
是
a == y
产生DeprecationWarning
的。这是将列表与numpy数组进行比较的结果。
然后您y=a
。现在y
是一个列表,而不是原始数组(或矩阵)。因此,在下一个循环中,OrdenaMatriz
被列表调用。那个时候
y[a,2] < y[a+1,2]
引发TypeError。对于数组/矩阵,这种索引是可以的,但对于列表而言,不是。
因此,如果您坚持使用此代码或类似的代码,请从np.array()
调用开始,并确保OrdenaMatriz
返回数组,而不是列表。
答案 1 :(得分:0)
“此代码的目的是使用第三列作为参数来排列行。”:
>>> y = y[np.argsort(y[:,-1].T),:]
>>> y
matrix([[[10, 7, 1],
[-1, 1, 4],
[ 2, -2, 7]]])
喜欢吗?