0

我从 matplotlib.mlab.csv2rec 函数中得到了 recarray。我的期望是它会有像'x'这样的2维,但它有像'y'这样的1维。有什么方法可以从 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,)
>>>
4

3 回答 3

2

你可以通过熊猫来做到这一点:

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 相比,pandas 对命名列的支持更加深入。

>>> 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
于 2013-10-10T14:07:37.337 回答
0

听起来很奇怪,但是...我可以使用 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

同样在我的情况下,我不需要第一列来做出决定。

于 2009-10-19T12:42:30.997 回答
0

好吧,可能有比这更有效的方法,但这里有一种方法:

#!/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()
于 2009-10-19T17:39:50.467 回答