将法线矩阵转换为numpy

时间:2018-08-24 03:30:53

标签: python python-3.x numpy

此代码的目的是使用第三列作为参数来排列行。如果我使用普通矩阵,则该程序可以正常运行,但是我需要使用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

2 个答案:

答案 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.matrixnp.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]]])

喜欢吗?