我正在尋找可以幫助我執行以下操作的解決方案。
假設我必須使用手繪設計生成 HTML 代碼。我得到了元素型別、x、y 坐標寬度和高度作為 NumPy 陣列。如果兩個元素的值相同,我需要根據 y 坐標對這些陣列進行排序,然后根據 y 值進行排序。然后我需要將相同型別的元素分組。
我創建了這樣的陣列:
import numpy
s = numpy.array([
#element type, x,y,width,height
["hyperlink", 5, 150, 25, 10],
["paragraph", 20, 60, 10, 10],
["image", 85, 150, 25, 10],
["radio", 20, 60, 10, 10],
["radio", 85, 150, 25, 10],
["button", 20, 60, 10, 10],
["text_field", 20, 40, 25, 10],
["label", 10, 10, 20, 10]])
print(s)
lists = s.tolist()
print([{"element_type ": x[0] , "x": x[1], "y": x[2], "width":x[3], "height" :x[4]} for i, x in enumerate(lists)])
我想對其進行排序,以便我的點按 y 坐標排序,然后在坐標相同的情況下按 x 排序。
然后我需要對元素進行分組,例如上面示例中的兩個單選按鈕。我預期的輸出如下。
{
'element_type ': 'hyperlink',
'group_id' :"1",
'x': '5',
'y': '150',
'width': '25',
'height': '10'
},
{
'element_type ': 'image',
'group_id' :"3",
'x': '85',
'y': '150',
'width': '25',
'height': '10'
},
{'element_type ': 'radio',
'group_id' :"4",
'x': '20',
'y': '60',
'width': '10',
'height': '10'
},
{
'element_type ': 'radio',
'group_id' :"4",
'x': '85',
'y': '150',
'width': '25',
'height': '10'
},
{
'element_type ': 'text_field',
'group_id' :"5",
'x': '20',
'y': '40',
'width': '25',
'height': '10'
},
{'element_type ': 'label',
**group_id :"5",**
'x': '10',
'y': '10',
'width': '20',
'height': '10'
}]
我可以對此有所了解嗎?我用過蟒蛇。
uj5u.com熱心網友回復:
numpy不是為 groupby 操作而設計的。除非你強迫它。pandas這里是一個更好的選擇。
import pandas as pd
df = pd.DataFrame(s, columns = ['element_type', 'x', 'y', 'width', 'height'])
df['group_id'] = df.groupby(['x', 'y', 'width', 'height']).ngroup()
>>> df.to_dict('records')
[{'element type': 'hyperlink',
'x': '5',
'y': '150',
'width': '25',
'height': '10',
'group_id': 3},
...,
{'element type': 'label',
'x': '10',
'y': '10',
'width': '20',
'height': '10',
'group_id': 0}]
uj5u.com熱心網友回復:
我認為分組與排序有關,所以這里是。
您可以使用
numpy.lexsort方法先排序y,然后再排序x。然后使用
pandas.groupby分組依據element_type并分配組號。最后轉換回字典。
import numpy as np import pandas as pd s = s[np.lexsort((s[:,2], s[:,1]))] df = pd.DataFrame(s, columns = ['element_type', 'x', 'y', 'width', 'height']) df['group_id'] = (df.groupby(['element_type']).ngroup() 1).astype(str) output = df.to_dict("records")
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/367997.html
