Howto Bin Series من القيم العائمة في الرسم البياني في بيثون؟

StackOverflow https://stackoverflow.com/questions/1721273

سؤال

لقد وضعت من القيمة في تعويم (أقل من 0). التي أريد بن في الرسم البياني، أنا، ه. يحتوي كل بار في الرسم البياني على مجموعة من القيمة [0،0.150)

البيانات التي يبدو لي مثل هذا:

0.000
0.005
0.124
0.000
0.004
0.000
0.111
0.112

عندما يكون الرمز الخاص بي أدناه أتوقع الحصول على نتيجة تبدو وكأنها

[0, 0.005) 5
[0.005, 0.011) 0
...etc.. 

حاولت أن أفعل هذا binning مع هذا الرمز من الألغام. لكن لا يبدو أن العمل. ما هي الطريقة الصحيحة للقيام بذلك؟

#! /usr/bin/env python


import fileinput, math

log2 = math.log(2)

def getBin(x):
    return int(math.log(x+1)/log2)

diffCounts = [0] * 5

for line in fileinput.input():
    words = line.split()
    diff = float(words[0]) * 1000;

    diffCounts[ str(getBin(diff)) ] += 1

maxdiff = [i for i, c in enumerate(diffCounts) if c > 0][-1]
print maxdiff
maxBin = max(maxdiff)


for i in range(maxBin+1):
     lo = 2**i - 1
     hi = 2**(i+1) - 1
     binStr = '[' + str(lo) + ',' + str(hi) + ')'
     print binStr + '\t' + '\t'.join(map(str, (diffCounts[i])))

~

هل كانت مفيدة؟

المحلول

عندما تكون ممكنا، لا إعادة اختراع العجلة. Numpy لديه كل ما تحتاجه:

#!/usr/bin/env python
import numpy as np

a = np.fromfile(open('file', 'r'), sep='\n')
# [ 0.     0.005  0.124  0.     0.004  0.     0.111  0.112]

# You can set arbitrary bin edges:
bins = [0, 0.150]
hist, bin_edges = np.histogram(a, bins=bins)
# hist: [8]
# bin_edges: [ 0.    0.15]

# Or, if bin is an integer, you can set the number of bins:
bins = 4
hist, bin_edges = np.histogram(a, bins=bins)
# hist: [5 0 0 3]
# bin_edges: [ 0.     0.031  0.062  0.093  0.124]

نصائح أخرى

from pylab import *
data = []
inf = open('pulse_data.txt')
for line in inf:
    data.append(float(line))
inf.close()
#binning
B = 50
minv = min(data)
maxv = max(data)
bincounts = []
for i in range(B+1):
    bincounts.append(0)
for d in data:
    b = int((d - minv) / (maxv - minv) * B)
    bincounts[b] += 1
# plot histogram

plot(bincounts,'o')
show()

الخطأ الأول هو:

Traceback (most recent call last):
  File "C:\foo\foo.py", line 17, in <module>
    diffCounts[ str(getBin(diff)) ] += 1
TypeError: list indices must be integers

لماذا تقول Int To A Str عندما تكون هناك حاجة إلى شارع؟ إصلاح ذلك، ثم نحصل على:

Traceback (most recent call last):
  File "C:\foo\foo.py", line 17, in <module>
    diffCounts[ getBin(diff) ] += 1
IndexError: list index out of range

لأنك قدمت فقط 5 دلاء. أنا لا أفهم مخطط الإدار الخاص بك، لكن دعونا نجعلها 50 دلاء ومعرفة ما يحدث:

6
Traceback (most recent call last):
  File "C:\foo\foo.py", line 21, in <module>
    maxBin = max(maxdiff)
TypeError: 'int' object is not iterable

maxdiff هي قيمة واحدة من قائمة Ints الخاصة بك، فما هو max تفعل هنا؟ أخرجها، الآن نحصل على:

6
Traceback (most recent call last):
  File "C:\foo\foo.py", line 28, in <module>
    print binStr + '\t' + '\t'.join(map(str, (diffCounts[i])))
TypeError: argument 2 to map() must support iteration

بالتأكيد ما يكفي، أنت تستخدم قيمة واحدة كوسيطة ثانية map. وبعد دعونا تبسيط آخر سطرين من هذا:

 binStr = '[' + str(lo) + ',' + str(hi) + ')'
 print binStr + '\t' + '\t'.join(map(str, (diffCounts[i])))

الى هذا:

 print "[%f, %f)\t%r" % (lo, hi, diffCounts[i])

الآن يطبع:

6
[0.000000, 1.000000)    3
[1.000000, 3.000000)    0
[3.000000, 7.000000)    2
[7.000000, 15.000000)   0
[15.000000, 31.000000)  0
[31.000000, 63.000000)  0
[63.000000, 127.000000) 3

لست متأكدا مما يجب عمله هنا، لأنني لا أفهم بالفعل الدواء الذي تأمل فيه استخدامه. يبدو أنه ينطوي على صلاحيات ثنائية، لكنه ليس منطقيا بالنسبة لي ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top