numpy로 바꿨더니, 훨씬 빠르네.


numpy에 array count 구하는 게 없어서 불편했는데,

bincount로 대신해서 쓸 수 있었다.

numpy.bincount

>>> np.bincount(np.array([0, 1, 1, 3, 2, 1, 7]))
array([1, 3, 1, 1, 0, 0, 0, 1])

전체 count를 구하는 것인데도 O(n)보다 더 빠른 것 같아... 내 착각인가


np.histogram이나 Counter도 쓸 수 있나보다.

find the most frequent number in a numpy vector

How can I generate a complete histogram with numpy?


결과를 python list 변수 그대로 출력해두기

execfile("...py")로 불러들일 수 있다.


계산에 1시간 쯤 걸리는 것 같다.


고친 부분

n_slots = 1000

n_iterations = 10000

n_people_range = range(n_slots*2, 50000, n_iterations/100)

...

votes = numpy.random.randint(n_slots, size=n_people)

#slot_histogram, n_bins = numpy.histogram(votes)

slot_histogram = numpy.bincount(votes)

#for i in votes:

# slot_histogram[i] = slot_histogram[i] + 1


...

counts = numpy.bincount(slot_histogram)

n_0_slots = counts[0]

n_1_slots = counts[1]

...


n_0_blur_hist = [x/float(n_iterations) for x in n_0_hist]

n_1_blur_hist = [x/float(n_iterations) for x in n_1_hist]


postfix = str(n_slots) + "_" + str(n_people_range[-1] + 1)

fp = open(os.path.dirname(os.path.abspath(__file__)) + "/blur_hist_" + postfix + ".py", "w")

print >>fp, ("range_" + postfix + " = " + str(people_x_range))

print >>fp, ("n_0_hist_" + postfix + " = " + str(n_0_blur_hist))

print >>fp, ("n_1_hist_" + postfix + " = " + str(n_1_blur_hist))

fp.close()






블로그 이미지

언제나19

기본에 충실하는 19식 재테크. 교과서 중심으로 공부했어요.

,



지난 번 계산에 초록색 선을 더했다.

제일 많이 겹치는 slot의 사람 수

80배 사람이 슈팅하더라도 110명 정도밖에 안 겹친다.

160배 사람이면, 200명 정도 겹친다.


하지만, 사람들이 아주 랜덤으로 선택하는 게 아니므로, 예측 결과의 1/2 정도만 겹친다고 생각하면 될까나





추가한 code

n_max_slots = max(slot_histogram)


n_max_hist[i_hist] += n_max_slots


plot.scatter(n_people_range, n_max_blur_hist, c='green', lw=0, alpha=0.5)




블로그 이미지

언제나19

기본에 충실하는 19식 재테크. 교과서 중심으로 공부했어요.

,