使用python从数字列表中保存有序对

时间:2015-07-21 03:59:06

标签: python

我有一系列数字:

q1a = [1,2,2,2,4,3,1,3,3,4,0,0]

我想将这些保存在一个数组中,使用PYTHON将其存储为(数字,数字的比例)。

如:[[0 0.1667],[1 0.1667],[2 0.25],[3 0.25],[4 0.167]]。

这对于计算数字的分布至关重要。我怎么能这样做?

虽然我编写的代码将数字保存为:(数字,列表中出现的次数),但我无法弄清楚如何找到每个数字的比例。感谢。

sorted_sample_values_of_x = unique, counts = np.unique(q1a, return_counts=True)
np.asarray((unique, counts)).T
np.put(q1a, [0], [0])

sorted_x = np.matrix(sorted_sample_values_of_x)
sorted_x = np.transpose(sorted_x)
print('\n' 'Values of x (sorted):' '\n')
print(sorted_x)

6 个答案:

答案 0 :(得分:1)

>>> q1a = [1,2,2,2,4,3,1,3,3,4,0,0]
>>> from collections import Counter
>>> sorted([[x, float(y)/len(q1a)] for (x, y) in Counter(q1a).items()],
...        key=lambda x: x[0])
[[0, 0.16666666666666666],
 [1, 0.16666666666666666],
 [2, 0.25],
 [3, 0.25],
 [4, 0.16666666666666666]]

答案 1 :(得分:1)

你需要做两件事。

  1. sorted_x数组转换为float数组。

  2. 然后将其除以counts数组的总和。

  3. 示例 -

    In [34]: sorted_x = np.matrix(sorted_sample_values_of_x)
    
    In [35]: sorted_x = np.transpose(sorted_x).astype(float)
    
    In [36]: sorted_x
    Out[36]:
    matrix([[ 0.,  2.],
            [ 1.,  2.],
            [ 2.,  3.],
            [ 3.,  3.],
            [ 4.,  2.]])
    
    In [37]: sorted_x[:,1] = sorted_x[:,1]/counts.sum()
    
    In [38]: sorted_x
    Out[38]:
    matrix([[ 0.        ,  0.16666667],
            [ 1.        ,  0.16666667],
            [ 2.        ,  0.25      ],
            [ 3.        ,  0.25      ],
            [ 4.        ,  0.16666667]])
    

    要将具有属性的数字存储在新数组中,请执行 -

    In [41]: sorted_x = np.matrix(sorted_sample_values_of_x)
    
    In [42]: sorted_x = np.transpose(sorted_x).astype(float)
    
    In [43]: ns = sorted_x/np.array([1,counts.sum()])
    
    In [44]: ns
    Out[44]:
    matrix([[ 0.        ,  0.16666667],
            [ 1.        ,  0.16666667],
            [ 2.        ,  0.25      ],
            [ 3.        ,  0.25      ],
            [ 4.        ,  0.16666667]])
    

答案 2 :(得分:0)

In [12]: from collections import Counter

In [13]: a = [1,2,2,2,4,3,1,3,3,4,0,0]

In [14]: counter = Counter(a)

In [15]: sorted( [ [key, float(counter[key])/len(a)]  for key in counter ] )
Out[15]:
[[0, 0.16666666666666666],
 [1, 0.16666666666666666],
 [2, 0.25],
 [3, 0.25],
 [4, 0.16666666666666666]]

答案 3 :(得分:0)

#!/usr/bin/env python
import numpy as np
q1a = [1,2,2,2,4,3,1,3,3,4,0,0]

unique, counts = np.unique(q1a, return_counts=True)
counts = counts.astype(float) # convert to float
counts /= counts.sum()        # counts -> proportion
print(np.c_[unique, counts])

输出

[[ 0.          0.16666667]
 [ 1.          0.16666667]
 [ 2.          0.25      ]
 [ 3.          0.25      ]
 [ 4.          0.16666667]]

答案 4 :(得分:0)

作为collections.Counter的替代方案,请尝试collections.defaultdict。这允许您在进行输入时累积总频率(即应该更有效)并且它更具可读性(IMO)。

from collections import defaultdict

q1a = [1,2,2,2,4,3,1,3,3,4,0,0]
n = float(len(q1a))
frequencies = defaultdict(int)
for i in q1a:
    frequencies[i] += 1/n

print frequencies.items()
[(0, 0.16666666666666666), (1, 0.16666666666666666), (2, 0.25), (3, 0.25), (4, 0.16666666666666666)]

答案 5 :(得分:0)

使用numpy的有趣替代方案

<?php
session_start();

if(isset($_POST['username'])){

    include_once("dbconnect.php");

    $usname = strip_tags($_POST["username"]);
    $paswd = strip_tags($_POST["password"]);

    $usname = mysqli_real_escape_string($dbCon, $usname);
    $paswd = mysqli_real_escape_string($dbCon, $paswd);

    $paswd = md5($paswd);

    $sql = "SELECT id, fooruminimi, password FROM liikmed WHERE username = '$usname' AND aktiveeritud = '1' LIMIT 1";
    $query = mysqli_query($dbCon, $sql);
    $row = mysqli_fetch_row($query);
    $uid = $row[0];
    $dbUsname = $row[1];
    $dbPassword = $row[2];

    if($usname == $dbUsname && $paswd == $dbPassword){
        //Sessioni avamine
        $_SESSION['username'] = $usname;
        $_SESSION['id'] = $uid;
        //Suunamine
        header("Location: user.php");       
    }
    else{
        echo "<h2> Vale kasutajanimi või parool!</h2>";
    }
}
?>

print [(val, 1.*np.sum(q1a==val)/len(q1a) ) for val in np.unique(q1a) ] #[(0, 0.16666666666666666), #(1, 0.16666666666666666), #(2, 0.25), #(3, 0.25), #(4, 0.16666666666666666)] 是强制浮动分割