如何使用空值从数据库创建numpy 2d数组

时间:2013-10-03 11:38:51

标签: python arrays numpy nonetype

我正在尝试使用python可以通过列名访问的2d数组。 数据来自数据库,它可能具有不同的类型和空值。 元组中不允许NoneType,因此我尝试用np.nan替换它们。

如果数据库中没有空值,则此代码可以正常工作。但是,我的最终目标是拥有一个蒙面数组,但我甚至无法创建数组。

import MySQLdb
import numpy

connection = MySQLdb.connect(host=server, user=user, passwd=password, db=db)
cursor = connection.cursor()
cursor.execute(query)
results = list(cursor.fetchall())

dt = [('cig', int), ('u_CIG', 'S10'), ('e_ICO', float), ('VCO', int)]

for index_r, row in enumerate(results):
    newrow = list(row)
    for index_c, col in enumerate(newrow):
        if col is None:
            newrow[index_c] = numpy.nan
    results[index_r] = tuple(newrow)
 x = numpy.array(results, dtype=dt)

产生的错误是:

x = numpy.array(results, dtype=dtypes)
ValueError: cannot convert float NaN to integer

执行fetchall后,结果包含以下内容:

[(10L,
'*',
Decimal('3.47'),
180L),
(27L,
' ',
Decimal('7.21'),
None)]

我怎么知道如何解决这个问题?谢谢!

2 个答案:

答案 0 :(得分:2)

没有NaN的整数表示。您可以切换到浮点,或在填充数组时构造掩码:

>>> values = [1, 2, None, 4]
>>> arr = np.empty(len(values), dtype=np.int64)
>>> mask = np.zeros(len(values), dtype=np.bool)
>>> for i, v in enumerate(values):
...     if v is None:
...         mask[i] = True
...     else:
...         arr[i] = v
...         
>>> np.ma.array(arr, mask=mask)
masked_array(data = [1 2 -- 4],
             mask = [False False  True False],
       fill_value = 999999)

答案 1 :(得分:0)

以Larsmans为例,我认为你想要的是:

    import numpy as np
    import numpy.ma as ma

    values = [('<', 2, 3.5, 'as', 6), (None, None, 6.888893, 'bb', 9),
              ('a', 66, 77, 'sdfasdf', 45)]
    nrows = len(values)

    arr = ma.zeros(nrows, dtype=[('c1', 'S1'),('c2', np.int), ('c3', np.float), 
                                 ('c4', 'S8'), ('c5', np.int)])

    for i, row in enumerate(values):
        for j, cell in enumerate(values[i]):
            if values[i][j] is None:
                arr.mask[i][j] = True
            else:
                arr.data[i][j] = cell

    print arr