Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/293.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将元组列表转换为具有命名列的numpy数组(元组列表的genfromtxt)_Python_Numpy - Fatal编程技术网

Python 将元组列表转换为具有命名列的numpy数组(元组列表的genfromtxt)

Python 将元组列表转换为具有命名列的numpy数组(元组列表的genfromtxt),python,numpy,Python,Numpy,所以直到现在我还在把CSV读入numpy数组 样本行: 20041207,7.04,7.18,6.88,7.10,25981485 守则: import datetime import numpy as np import matplotlib.dates as dt def mkdate(text): return dt.date2num(datetime.datetime.strptime(text, '%Y%m%d')) np.genfromtxt( filena

所以直到现在我还在把CSV读入numpy数组

样本行:

20041207,7.04,7.18,6.88,7.10,25981485
守则:

import datetime
import numpy as np
import matplotlib.dates as dt


def mkdate(text):
    return dt.date2num(datetime.datetime.strptime(text, '%Y%m%d'))


np.genfromtxt(
    filename,
    delimiter=',',
    skip_header=1,
    usecols=[1, 2, 5, 3, 4, 6],
    names=('date', 'open', 'close', 'high', 'low', 'volume'),
    converters={'date': mkdate},
    dtype=(
        np.float64,
        np.float64,
        np.float64,
        np.float64,
        np.float64,
        np.int64
    )
)
现在我必须切换到数据库。从数据库中获取相关值后,看起来是这样的(元组列表):

现在,我需要将其转换为与以前相同的numpy数组,就像我想象的那样

[(datetime.datetime(2004, 12, 7, 0, 0), Decimal('7.04000'), Decimal('7.10000'), Decimal('7.18000'), Decimal('6.88000'), 25981485L), (and so on), ... ]
def mkdate(date):
    return dt.date2num(date)

np.somefunction(
    list_of_tuples,
    names=('date', 'open', 'close', 'high', 'low', 'volume'),
    converters={
        'date': mkdate,
        'open': float,
        'close': float,
        'high': float,
        'low': float,
        'volume': int,
    },
    dtype=(
        np.float64,
        np.float64,
        np.float64,
        np.float64,
        np.float64,
        np.int64
    )
)
所以要总结一下:我需要将元组列表转换为带有命名列的numpy数组。

如果
np.readtxt()
不可行,也许您将dict与numpy的1D数组结合就足够了:

tofloat = lambda w: float(w)  # must be function not type
converters={
    'date': mkdate,
    'open': tofloat,
    'close': tofloat,
    'high': tofloat,
    'low': tofloat,
    'volume': lambda w: int(w),
}
# dict with 1D lists per column: 
dd = dict([(k,[]) for k in converters.keys()])  
with open(fname, 'r') as f:
    for l in f:  # read line
       ww = l.split(',') # split line into strings
       for w,k in zip(ww,dd.keys()):  # iterate over strings and column names
           f = converters[k]
           dd[k].append(f(w)) # append to proper dict-entry list
# convert to dict with numpy arrays:
dd_a = dict([(k,np.asarray(v)) for k,v in dd.items()])

旁白:如果您使用的是OHLC数据,那么它将比bare
numpy
更容易使用。如果没有更好的方法,我将不得不使用这种方法。但它并不理想,因为我使用前一个数组,如array[index]['column\u name']和array['column\u name'][index],这取决于我需要它做什么。因此,重写代码的重要部分是必要的。不过还是要谢谢你,因为这是一种可行的方法。你实际上可以编写
dd\u a['column\u name'][index]
。如果不想更改代码,可以编写一个小的包装类,在该类中使用
\uu getitem\uuuu()
重载
[]
-运算符,以提供所需的访问方法。