簡體   English   中英

如何在Python中的數字內存儲數字列表?

[英]How can I store a list of number inside a number in Python?

我需要在僅接受數字(整數或浮點數)的列中保存4個數字的元組

我有4個數字的列表,例如-0.0123445552,-29394.2393339、0.299393333、0.00002345556。

如何將所有這些數字“存儲”在一個數字中,並能夠在Python中檢索原始元組?

謝謝

跟進@YevgenYampolskiy使用numpy的想法:

您可以使用numpy將數字轉換為16位浮點數,然后將數組視為一個64位int:

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]

注意:這需要numpy 1.6或更高版本,因為這是第一個支持16位浮點數的版本。

如果用int表示Python中的數據類型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)

您可以使用struct模塊將4個整數組合為一個整數,或將兩個浮點數組合為一個double:

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個浮點數打包為單個浮點數,您將需要使用半浮點數,但是這是一個問題:

對於半浮點型,到目前為止,似乎沒有python的本機支持: http : //bugs.python.org/issue11734

但是numpy模塊的確支持半浮點數( http://docs.scipy.org/doc/numpy/user/basics.types.html )。 也許您可以使用它以某種方式將4個浮標打包到單個浮標中

我的想法很奇怪; 但這會工作嗎?

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使其數量math.log 當我們進入Out[36]

這並不能真正回答您的問題,但是您嘗試執行的操作違反了1NF 更改數據庫架構以引入交叉表真的不是一種選擇嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM