1

Pythonを使用して列名でアクセスできる2次元配列を操作しようとしています。データはデータベースから取得され、さまざまな型と null 値を持つ場合があります。 NoneTypeはタプルでは許可されていないため、np.nan に置き換えようとしました。

このコードは、データベースに null 値がない場合に機能します。ただし、最終的な目標はマスクされた配列を作成することですが、配列を作成することさえできません。

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)]

この問題を解決するにはどうすればよいですか?ありがとうございました!

4

2 に答える 2

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)
于 2013-10-03T11:45:37.437 に答える