[英]python reshape structure array to normal numpy array
我有一個看起來像這樣的結構數組
[(1, 2, 3, 4) (5, 6, 7, 8)]
我刪除了第一列,使它看起來像這樣
[(2, 3, 4) (6, 7, 8)]
但是當我將其整形為數組時,它看起來像這樣
[[1 2 3 4]
[5 6 7 8]]
“ 1”和“ 5”不應該在那里
這是我的代碼
import numpy as np
array = np.array([(1,2,3,4), (5,6,7,8)],dtype=[('a', 'i4'), ('b', 'i4'), ('c', 'i4'),('d', 'i4')])
names = list(array.dtype.names)
new_names=names[1:]
data = array[new_names]
new_array = data.view('i4').reshape(len(data),-1)
我可以知道為什么以及如何編輯嗎?
In [128]: array = np.array([(1,2,3,4), (5,6,7,8)],dtype=[('a', 'i4'), ('b', 'i4'), ('c', '
...: i4'),('d', 'i4')])
...: names = list(array.dtype.names)
...: new_names=names[1:]
...: data = array[new_names]
In [129]: array.dtype
Out[129]: dtype([('a', '<i4'), ('b', '<i4'), ('c', '<i4'), ('d', '<i4')])
In [130]: names
Out[130]: ['a', 'b', 'c', 'd']
In [131]: data
Out[131]:
array([(2, 3, 4), (6, 7, 8)],
dtype={'names':['b','c','d'], 'formats':['<i4','<i4','<i4'], 'offsets':[4,8,12], 'itemsize':16})
請注意, data.dtype
具有offsets
。 在最新的numpy
版本中,選擇字段的子numpy
生成一個view
。 array['a']
仍然存在,只是“隱藏”。
伴隨着這一變化,他們在recfunctions
添加了一些功能:
In [133]: import numpy.lib.recfunctions as rf
要復制沒有'a'數據的副本:
In [134]: data1 = rf.repack_fields(data)
In [135]: data1
Out[135]:
array([(2, 3, 4), (6, 7, 8)],
dtype=[('b', '<i4'), ('c', '<i4'), ('d', '<i4')])
並制作一個非結構化數組:
In [136]: rf.structured_to_unstructured(array)
Out[136]:
array([[1, 2, 3, 4],
[5, 6, 7, 8]], dtype=int32)
In [137]: rf.structured_to_unstructured(data)
Out[137]:
array([[2, 3, 4],
[6, 7, 8]], dtype=int32)
In [138]: rf.structured_to_unstructured(data1)
Out[138]:
array([[2, 3, 4],
[6, 7, 8]], dtype=int32)
這些功能記錄在:
https://docs.scipy.org/doc/numpy/user/basics.rec.html#accessing-multiple-fields
由於所有字段都具有相同的dtype('i4') view
,因此在一定程度上
In [142]: data.view('i4')
Out[142]: array([1, 2, 3, 4, 5, 6, 7, 8], dtype=int32)
In [143]: data1.view('i4')
Out[143]: array([2, 3, 4, 6, 7, 8], dtype=int32)
但這是基礎數據的視圖,形狀混亂。 早期版本中存在此形狀問題。 因此,最好是仔細閱讀所做的更改,並使用推薦的功能。
在之前的SO問題中,我可能建議使用列表作為中介:
In [144]: data.tolist()
Out[144]: [(2, 3, 4), (6, 7, 8)]
In [145]: np.array(data.tolist())
Out[145]:
array([[2, 3, 4],
[6, 7, 8]])
嘗試在末尾切片:
new_array = data.view('i4').reshape(len(data),-1)[:,1:]
結果:
[[2 3 4]
[6 7 8]]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.