我一直在使用這種結構來排序向量(數組)的向量的某些屬性。這種結構(通過將它們用標量壓縮並按標量排序來排序向量)一直在其他部分代碼中工作,但在這種情況下,它失敗並顯示警告: 數組的真值更多比一個元素含糊不清。這取決於標量是有重複值(見下文)排序標量和numpy數組的壓縮列表:不處理重複
from numpy import array
pnts =[array([ 0. , 0.45402743, -0.64209154]),
array([-0.27803373, 0.45402743, -0.64209154]),
array([-0.64874546, 0.45402743, 0. ]),
array([-0.27803373, 0.45402743, 0.64209154]),
array([ 0. , 0.45402743, 0.64209154]),
array([ 0. , -0.45402743, 0.64209154]),
array([-0.27803373, -0.45402743, 0.64209154]),
array([-0.64874546, -0.45402743, 0. ]),
array([-0.27803373, -0.45402743, -0.64209154]),
array([ 0. , -0.45402743, -0.64209154]),
array([-0.46338972, 0. , 0.64209154]),
array([-0.46338972, 0. , -0.64209154]),
array([-0.83410135, 0. , 0. ])]
ds = [0.64209154071986396, 0.69970301064027385, 0.64874545642786008,
0.69970301064027385, 0.64209154071986396, 0.64209154071986396,
0.69970301064027385, 0.64874545642785986, 0.69970301064027385,
0.64209154071986396, 0.79184062463701899, 0.79184062463701899,
0.83410134835400274]
pnts = [pnt for (d,pnt) in sorted(zip(ds,pnts))] #sort by distances ds
print pnts
但是,如果我把它縮短到第一3點,它的工作:
from numpy import array
pnts =[array([ 0. , 0.45402743, -0.64209154]),
array([-0.27803373, 0.45402743, -0.64209154]),
array([-0.64874546, 0.45402743, 0. ])]
ds = [0.64209154071986396, 0.69970301064027385, 0.64874545642786008]
pnts = [pnt for (d,pnt) in sorted(zip(ds,pnts))]
print pnts
>[array([ 0. , 0.45402743, -0.64209154]), array([-0.64874546, 0.45402743, 0. ]), array([-0.27803373, 0.45402743, -0.64209154])]
我敢肯定這個問題是因爲ds之間有重複。當我從3點到4點出現第一個副本時,它再次失敗。但是其他Python中的排序例程在重複時很好地工作。爲什麼不是這個?
爲什麼要使用'np.arrays'的'list'。 –
一般來說,當您嘗試比較2個數組並將結果用作標量布爾值時,會產生「ValueError」。經典案例是「如果A == B:」。這是因爲'sort'試圖比較'pts'列表中的兩個數組。 – hpaulj