2

数値 (int または float) のみを受け入れる列内に 4 つの数値のタプルを保存する必要があります。

-0.0123445552、-29394.2393339、0.299393333、0.00002345556 のような 4 つの数値のリストがあります。

これらすべての数値を数値内に「格納」し、Python で元のタプルを取得するにはどうすればよいですか?

ありがとう

4

5 に答える 5

3

numpyを使用するという @YevgenYampolskiy のアイデアをフォローアップします。

numpy を使用して数値を 16 ビット浮動小数点数に変換し、配列を 1 つの 64 ビット整数として表示できます。

import numpy as np

data = np.array((-0.0123445552, -29394.2393339, 0.299393333, 0.00002345556))

stored_int = data.astype('float16').view('int64')[0]
print(stored_int)
# 110959187158999634

recovered = np.array([stored_int], dtype='int64').view('float16')
print(recovered)
# [ -1.23443604e-02  -2.93920000e+04   2.99316406e-01   2.34842300e-05]

注: これは 16 ビット浮動小数点数をサポートする最初のバージョンであるため、これには numpy バ​​ージョン 1.6 以降が必要です。

于 2013-01-20T19:06:36.777 に答える
2

intPython のデータ型 int (現在のバージョンでは無制限) を意味する場合は、次の解決策を使用できます。

>>> x
(-0.0123445552, -29394.2393339, 0.299393333, 2.345556e-05)
>>> def encode(data):
    sz_data = str(data)
    import base64
    b64_data = base64.b16encode(sz_data)
    int_data = int(b64_data, 16)
    return int_data

>>> encode(x)
7475673073900173755504583442986834619410853148159171975880377161427327210207077083318036472388282266880288275998775936614297529315947984169L
>>> def decode(data):
    int_data = data
    import base64
    hex_data = hex(int_data)[2:].upper()
    if hex_data[-1] == 'L':
        hex_data = hex_data[:-1]
    b64_data = base64.b16decode(hex_data)
    import ast
    sz_data = ast.literal_eval(b64_data)
    return sz_data

>>> decode(encode(x))
(-0.0123445552, -29394.2393339, 0.299393333, 2.345556e-05)
于 2013-01-20T18:07:30.527 に答える
1

モジュールを使用して、4 つの整数を 1 つの整数に結合したり、2 つの浮動小数点数を double に結合したりできstructます。

from struct import *
s = pack('hhhh', 1, -2, 3,-4)
i = unpack('Q', pack('Q', i[0]))
print i
print unpack('hhhh', s)

s = pack('ff', 1.12, -2.32)
f = unpack('d', s)
print f
print unpack('ff', pack('d', f[0]))

版画

(18445618190982447105L,)
(1, -2, 3, -4)
(-5.119999879002571,)
(1.1200000047683716, -2.319999933242798)

基本的に、この例のタプル (1,-2,3,-4) は整数 18445618190982447105 にパックされ、タプル ( 1.12, -2.32) は -5.119999879002571 にパックされます。

4 つのフロートを 1 つのフロートにパックするには、ハーフフロートを使用する必要がありますが、これはここで問題になります。

half-float を使用すると、現在 Python でネイティブ サポートがないように見えます: http://bugs.python.org/issue11734

ただしnumpy、モジュールはハーフフロートをある程度サポートしています ( http://docs.scipy.org/doc/numpy/user/basics.types.html )。多分あなたはそれを使って4つのフロートを1つのフロートに詰め込むことができます

于 2013-01-20T18:37:17.893 に答える
0

私の考えは奇妙です。しかし、それは動作しますか??

In [31]: nk="-0.0123445552, -29394.2393339, 0.299393333, 0.00002345556"

In [32]: nk1="".join(str(ord(x)) for x in nk)

In [33]: nk1
Out[33]: '454846484950515252535353504432455057515752465051575151515744324846505757515751515151443248464848484850515253535354'

In [34]: import math

In [35]: math.log(long(nk1), 1000)
Out[36]: 37.885954947611985

In [37]: math.pow(1000,_)
Out[37]: 4.548464849505043e+113

この文字列を簡単に展開できます( Out[33]); たとえば、で分割し32ます。そのためspaceです。
また、この文字列は非常に長いです。によって小さな数にすることができmath.logます。私たちが入ったときOut[36]

于 2013-01-20T17:59:09.773 に答える
0

これはあなたの質問に実際には答えませんが、あなたがやろうとしていることは1NFに違反しています。交差テーブルを導入するために DB スキーマを変更することは本当に選択肢ではないのでしょうか?

于 2013-01-20T18:14:43.863 に答える