[英]Sorting a multi-dimensional numpy array
我想通過x坐標對2x2 numpy數組進行排序。 我的目標是獲取一個數組,該數組從每對點中的最小X值到最大X值排序,同時使用該數組的所有值
使用以下代碼行創建了數組:
rect = np.empty((4, 2, 2))
數組內部值的實際輸出為:
[[[ -1000 , 97 ] #x0,y0 rect 0
[999 , 98]] #x1,y1 rect 0
[[410 , -1048] #x0,y0 rect 1
[619 , 940]] #x1,y1 rect 1
[[-1000, 226]
[999 , 227]]
[[229 , -983]
[55 , 1008]]]
期望的輸出是按照構成矩形的每對點中X的最小值進行排序,然后考慮所有矩形,按X進行排序,如下所示:
[[[ -1000 , 97 ]
[999 , 98]]
[[-1000, 226]
[999 , 227]]
[[55 , 1008]
[229 , -983]]
[[410 , -1048]
[619 , 940]]]
如果要執行此操作而不創建其他數組副本,則可以使用argsort
和indexing的組合來執行此操作。
import numpy as np
data = np.array(
[[[ -1000 , 97 ],
[999 , 98]],
[[410 , -1048],
[619 , 940]],
[[-1000, 226] ,
[999 , 227]],
[[229 , -983],
[55 , 1008]]])
def sortrect(rect):
x = rect[:, 0]
idx = np.argsort(x)
rect[:] = rect[idx]
for a in data:
sortrect(a)
minx = data[:, 0, 0]
idx = np.argsort(minx)
data[:] = data[idx]
同樣的事情,沒有循環,但是教學較少(對Martin的帶有軸的argsort表示敬意):
idx0 = np.arange(data.shape[0])[:, np.newaxis]
idx1 = np.argsort(data[:, :, 0], axis=1)
data = data[idx0, idx1]
minx = data[:, 0, 0]
idx = np.argsort(minx)
data[:] = data[idx]
形式為out = data[idx0, idx1]
的表達式表示
for all i, j:
out[i, j] = data[idx0[i, j], idx1[i, j]].
有關更多詳細信息,請參見https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#integer-array-indexing 。
再見循環和lambdas,歡迎速度
import numpy as np
original_array = np.array([[[ -1000 , 97 ],[999 , 98]],
[[410 , -1048],[619 , 940]], #original_array1,y1 rect 1
[[-1000, 226],[999 , 227]],
[[229 , -983],[55 , 1008]]])
#get indices of sorted x0 and x1 (0 means first element of both arrays)
# indices are 2 arrays - [0,0,0,1], [1,1,1,0],
# so you can see that last element needs to reposition
indices = np.argsort(original_array[:,:,0],axis=1)
#create new array
new = np.empty(shape=[4,2,2])
#move on correct posisitions sub arrays
#np.arange only create artifical indices for each rect
new[:,0,:]=original_array[np.arange(original_array.shape[0]),indices[:,0],:]
new[:,1,:]=original_array[np.arange(original_array.shape[0]),indices[:,1],:]
#When subarrays are sorted, sort parent arrays
final_sorted_array = new[new[:,0,0].argsort(),:,:]
print(final_sorted_array)
[[[-1000. 97.]
[ 999. 98.]]
[[-1000. 226.]
[ 999. 227.]]
[[ 55. 1008.]
[ 229. -983.]]
[[ 410. -1048.]
[ 619. 940.]]]
您可以為此使用sort函數的key
參數:
l = [[[ -1000 , 97 ],[999 , 98]],
[[410 , -1048], [619 , 940]],
[[-1000, 226],[999 , 227]],
[[229 , -983],[55 , 1008]]]
sorted(l, key=lambda x: (min(x[0][0], x[1][0]), max(x[0][0],x[1][0])))
>>> [[[-1000, 97], [999, 98]],
[[-1000, 226], [999, 227]],
[[229, -983], [55, 1008]],
[[410, -1048], [619, 940]]]
排序后的lambda會創建一個包含x
最小值和最大值的元組
而且,如果您使用的是Numpy,則可以編寫一些可以在更高維度上更好地概括的內容:
sorted(l, key=lambda x: sorted(x[..., 0]))
>>> [array([[-1000, 97], [ 999, 98]]),
array([[-1000, 226], [ 999, 227]]),
array([[ 229, -983], [ 55, 1008]]),
array([[ 410, -1048], [ 619, 940]])]
即使您有超過2個用於定義形狀的點,該x
也將起作用,並且將按最小x
值進行排序
編輯:對矩形內的內部點進行排序的更正:
sorted(np.sort(l, axis=1), key=lambda x: tuple(x[..., 0]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.