看起來你幾乎就在那裏。 list(v)
是一個列表,可以輕鬆轉換爲數組。
x=np.array([0,0,0,1,1,1,1,2,2,3,4,4,4])
{k:np.array(list(v)) for k,v in groupby(x)}
{0: array([0, 0, 0]),
1: array([1, 1, 1, 1]),
2: array([2, 2]),
3: array([3]),
4: array([4, 4, 4])}
或與2d數組(在第1列,然後在最後一列)。
x=np.array([[0,1,2],[1,2,3],[1,2,4],[1,0,4],[2,3,1]])
d={k:list(v) for k,v in groupby(x,lambda s:s[0])}
print d
# {0: [array([0, 1, 2])],
# 1: [array([1, 2, 3]), array([1, 2, 4]), array([1, 0, 4])],
# 2: [array([2, 3, 1])]}
for i in d.keys():
d[i]={k:np.array(list(v)) for k,v in groupby(list(d[i]),lambda s:s[2])}
print d
# {0: {2: array([[0, 1, 2]])},
# 1: {3: array([[1, 2, 3]]), 4: array([[1, 2, 4], [1, 0, 4])},
# 2: {1: array([[2, 3, 1]])}}
print d[1][4]
# [[1 2 4]
# [1 0 4]]
它沒有多大關係我是否使用list(v)
或np.array(list(v))
- 在任一階段(前提是你有興趣的迭代一號尺寸)。使用
改編自numpy的文檔
x = np.array([(1.5,2.5,(1.0,2.0)),(1.5,2.5,(2.0,4.0)),(3.,4.,(4.,5.)),(1.,3.,(2.,6.))],
dtype=[('x','f4'),('y',np.float32),('value','f4',(2,2))])
d={k:list(v) for k,v in groupby(x,lambda s:s['x'])}
for i in d.keys():
d[i]={k:list(v) for k,v in groupby(list(d[i]),lambda s:s['y'])}
pprint(d)
for dd in d[1.5][2.5]:
print dd
print d[1.5][2.5][0].dtype
# [('x', '<f4'), ('y', '<f4'), ('value', '<f4', (2, 2))]
dd = np.array(d[1.5][2.5],dtype=x.dtype)
print dd
print dd.dtype
print dd[0]
# (1.5, 2.5, [[1.0, 2.0], [1.0, 2.0]])
print dd['value']
# [[[ 1. 2.] [ 1. 2.]]
# [[ 2. 4.] [ 2. 4.]]]
的「最內」分子的結構化陣列字符被保留結構化陣列。如果我想將這些數組的列表變成一個數組(例如dd
),我只需要使用np.array(...,dtype=x.dtype)
。
在d[1.5][2.5][0]['value']
,1.5
和2.5
是字典鍵,0
是列表索引,和value
是一個結構陣列的字段名稱。
但是這個groupby
真的需要用嗎?我可以用普通的numpy索引獲得最後的'價值'。並且x
的'行'不必被排序。對於非常大的陣列,速度和內存使用可能是重要的考慮因素。
I=(x['x']==1.5)&(x['y']==2.5)
print x[I]['value']
你壓痕似乎有點可疑。 ..care要解決這個問題? – kindall
做什麼最好的方法是?我試圖強制執行每行79個字符的限制,但效果並不理想。 – calben
現在看起來更好! – kindall