[英]Is there any possibility to convert recarray to ndarray and change ndim?
我從matplotlib.mlab.csv2rec函數獲取recarray。 我的期望是它有2個像“ x”的維,但有1個像“ y”的維。 有什么方法可以從y獲取x嗎?
>>> import numpy as np
>>> from datetime import date
>>> x=np.array([(date(2000,1,1),0,1),
... (date(2000,1,1),1,1),
... (date(2000,1,1),1,0),
... (date(2000,1,1),0,0),
... ])
>>> x
array([[2000-01-01, 0, 1],
[2000-01-01, 1, 1],
[2000-01-01, 1, 0],
[2000-01-01, 0, 0]], dtype=object)
>>> y = np.rec.fromrecords( x )
>>> y
rec.array([(datetime.date(2000, 1, 1), 0, 1),
(datetime.date(2000, 1, 1), 1, 1),
(datetime.date(2000, 1, 1), 1, 0), (datetime.date(2000, 1, 1), 0, 0)],
dtype=[('f0', '|O4'), ('f1', '<i4'), ('f2', '<i4')])
>>> x.ndim
2
>>> y.ndim
1
>>> x.shape
(4, 3)
>>> y.ndim
1
>>> y.shape
(4,)
>>>
您可以通過熊貓來做到這一點:
import pandas as pd
pd.DataFrame(y).values
array([[2000-01-01, 0, 1],
[2000-01-01, 1, 1],
[2000-01-01, 1, 0],
[2000-01-01, 0, 0]], dtype=object)
但是如果我是你的話,我會考慮在熊貓上做我的項目。 對命名列的支持在pandas中比在常規numpy中更深入地構建。
>>> z = pd.DataFrame.from_records(y, index="f0")
>>> z
f1 f2
f0
2000-01-01 0 1
2000-01-01 1 1
2000-01-01 1 0
2000-01-01 0 0
>>> z["f1"]
f0
2000-01-01 0
2000-01-01 1
2000-01-01 1
2000-01-01 0
Name: f1
聽起來很奇怪,但是...我可以使用matplotlib.mlab.rec2csv保存到csv,然后使用numpy.loadtxt讀取到ndarray。 我的案子比較簡單,因為我已經有csv文件。 這是一個工作原理的例子。
>>> a = np.loadtxt( 'name.csv', skiprows=1, delimiter=',', converters = {0: lambda x: 0} )
>>> a
array([[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0. , 0. , 0. , 0. , 0. ],
[ 0. , 0.29, 0.29, 0.43, 0.29, 0. ],
[ 0. , 0.71, 0.29, 0.57, 0. , 0. ],
[ 0. , 1. , 0.57, 0.71, 0. , 0. ],
[ 0. , 0.43, 0.29, 0.14, 0.14, 0. ],
[ 0. , 1. , 0.43, 0.71, 0. , 0. ],
[ 0. , 0.57, 0.57, 0.29, 0.14, 0. ],
[ 0. , 1.43, 0.43, 0.86, 0.43, 0. ],
[ 0. , 1. , 0.71, 0.57, 0. , 0. ],
[ 0. , 1.14, 0.57, 0.29, 0. , 0. ],
[ 0. , 1.43, 0.29, 0.71, 0.29, 0.29],
[ 0. , 1.14, 0.43, 1. , 0.29, 0.29],
[ 0. , 0.43, 1.14, 0.86, 0.43, 0.14],
[ 0. , 1.14, 0.86, 0.86, 0.29, 0.29]])
>>> t = a.any( axis = 1 )
>>> t
array([False, False, False, False, False, False, False, False, False,
False, False, False, False, False, False, False, True, True,
True, True, True, True, True, True, True, True, True,
True, True], dtype=bool)
>>> a.ndim
2
同樣,就我而言,我不需要第一列即可做出決定。
好吧,也許有比這更有效的方法,但這是一種方法:
#!/usr/bin/env python
import numpy as np
from datetime import date
x=np.array([(date(2000,1,1),0,1),
(date(2000,1,1),1,1),
(date(2000,1,1),1,0),
(date(2000,1,1),0,0),
])
y=np.rec.fromrecords( x )
z=np.empty((len(y),len(y.dtype)),dtype='object')
for idx,field in enumerate(y.dtype.names):
z[:,idx]=y[field]
assert (x==z).all()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.