我試圖按照升序對一個 numpy 陣列串列進行排序,這個問題在這篇文章中討論過。具體來說,我使用的是帖子中評價最高的解決方案。
第一個示例產生了預期的解決方案:
>>> x1 = [np.array([1,2,3]),np.array([4,5,6]),np.array([7,8,9])]
>>> y1 = [6, 10 , 4]
>>> y1_sorted, x1_sorted = zip(*sorted(zip(y1, x1)))
>>> y1_sorted, x1_sorted
((4, 6, 10), (array([7, 8, 9]), array([1, 2, 3]), array([4, 5, 6])))
但是,第二個示例中的變數看似相同型別,卻產生了以下錯誤:
>>> x2 = [np.array([1, 2, 3]),
... np.array([1, 3, 2]),
... np.array([2, 1, 3]),
... np.array([2, 3, 1]),
... np.array([3, 1, 2]),
... np.array([3, 2, 1])]
>>> y2 = [6,3,7,1,3,8]
>>> y2_sorted, x2_sorted = zip(*sorted(zip(y2, x2)))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
誰能解釋一下發生了什么?我在 Python 3.8.12 中使用 numpy 1.20.3。
uj5u.com熱心網友回復:
sorted 函式默認按第一個元素對元組進行排序,如果有平局,則按第二個元素排序,如果仍然有平局,則按第三個元素排序,依此類推。
在y2, 3 出現兩次,所以sorted會查看要排序的元組的第二個元素,但第二個元素是陣列,所以不清楚如何對它們進行排序,所以你會得到一個錯誤。換句話說,就好像您運行了以下命令:
y2_sorted, x2_sorted = zip(*sorted(zip(y2, x2), key=lambda x: (x[0], x[1])))
您仍然可以sorted在這里使用函式的一種方法是按照@niko 的建議簡單地按第一個元素排序:
y2_sorted, x2_sorted = zip(*sorted(zip(y2, x2), key=lambda x: x[0]))
在這種情況下,您只按第一個元素排序(即排序依據y2),并將關系的排序保留y2為它出現的順序。
另一種方法是明確說明如何使用np.arrays. 也許您想按陣列中的第一個元素進行排序,以防存在關聯y2:
y2_sorted, x2_sorted = zip(*sorted(zip(y2, x2), key=lambda x: (x[0], x[1][0])))
最后,由于您有一個 串列np.arrays,您可以numpy.argsort改用:
x2_sorted = np.array(x2)[np.argsort(y2)]
uj5u.com熱心網友回復:
所以sorted(zip(y1, x1))代碼第一部分中的行似乎是根據y1.
您可以做的是使用 的key引數sorted來復制該行為
y2_sorted, x2_sorted = zip(*sorted(zip(y2, x2), key=lambda _: _[0]))
print(y2_sorted)
# (1, 3, 3, 6, 7, 8)
print(x2_sorted)
# (array([2, 3, 1, 4, 5, 6]), array([1, 3, 2, 4, 5, 6]), array([3, 1, 2, 4, 5, 6]), array([1, 2, 3, 4, 5, 6]), array([2, 1, 3, 4, 5, 6]), array([3, 2, 1, 4, 5, 6]))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/397430.html
上一篇:用python分析資料框
