Я хочу получить список данных, содержавшихся в мусорном ведре гистограммы. Я использую numpy и Matplotlib. Я знаю, как пересечь данные и проверить края мусорного ведра. Однако я хочу сделать это для 2D гистограммы и кода, чтобы сделать, это довольно ужасно. numpy имеет какие-либо конструкции для создания этого легче?
Для 1D случай, я могу использовать searchsorted (). Но логика не то, что намного лучше, и я действительно не хочу делать двоичный поиск на каждой точке данных, когда я не имею к.
Большая часть противной логики происходит из-за граничных областей мусорного ведра. Все регионы имеют границы как это: [левый край, правый край). Кроме последнего мусорного ведра, которое имеет регион как это: [левый край, правый край].
Вот некоторый пример кода для 1D случай:
import numpy as np
data = [0, 0.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5, 3]
hist, edges = np.histogram(data, bins=3)
print 'data =', data
print 'histogram =', hist
print 'edges =', edges
getbin = 2 #0, 1, or 2
print '---'
print 'alg 1:'
#for i in range(len(data)):
for d in data:
if d >= edges[getbin]:
if (getbin == len(edges)-2) or d < edges[getbin+1]:
print 'found:', d
#end if
#end if
#end for
print '---'
print 'alg 2:'
for d in data:
val = np.searchsorted(edges, d, side='right')-1
if val == getbin or val == len(edges)-1:
print 'found:', d
#end if
#end for
Вот некоторый пример кода для 2D случая:
import numpy as np
xdata = [0, 1.5, 1.5, 2.5, 2.5, 2.5, \
0.5, 0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, \
0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 2.5, 3]
ydata = [0, 5,5, 5, 5, 5, \
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, \
25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 30]
xbins = 3
ybins = 3
hist2d, xedges, yedges = np.histogram2d(xdata, ydata, bins=(xbins, ybins))
print 'data2d =', zip(xdata, ydata)
print 'hist2d ='
print hist2d
print 'xedges =', xedges
print 'yedges =', yedges
getbin2d = 5 #0 through 8
print 'find data in bin #', getbin2d
xedge_i = getbin2d % xbins
yedge_i = int(getbin2d / xbins) #IMPORTANT: this is xbins
for x, y in zip(xdata, ydata):
# x and y left edges
if x >= xedges[xedge_i] and y >= yedges[yedge_i]:
#x right edge
if xedge_i == xbins-1 or x < xedges[xedge_i + 1]:
#y right edge
if yedge_i == ybins-1 or y < yedges[yedge_i + 1]:
print 'found:', x, y
#end if
#end if
#end if
#end for
Существует ли инструмент для очистки / более эффективный способ сделать это? Кажется, что numpy имел бы что-то для этого.
digitize
, из ядра NumPy, даст вам индекс бина, к которому принадлежит каждое значение в вашей гистограмме:
import numpy as NP
A = NP.random.randint(0, 10, 100)
bins = NP.array([0., 20., 40., 60., 80., 100.])
# d is an index array holding the bin id for each point in A
d = NP.digitize(A, bins)
как насчет чего-то вроде:
In [1]: data = numpy.array([0, 0.5, 1.5, 1.5, 1.5, 2.5, 2.5, 2.5, 3])
In [2]: hist, edges = numpy.histogram(data, bins=3)
In [3]: for l, r in zip(edges[:-1], edges[1:]):
print(data[(data > l) & (data < r)])
....:
....:
[ 0.5]
[ 1.5 1.5 1.5]
[ 2.5 2.5 2.5]
In [4]:
с небольшим количеством кода для обработки крайних случаев.
У меня нет решения, но я нашел способ воспроизвести эту проблему.
После установки драгоценного камня ruby-debug-0.10.3 сегодня мой тест Rails 2.1.1, который вызывает "stderr.read" в блоке
Open4::popen4( "FOO" ) do | pid, stdin, stdout, stderr |
stderr.read
end
, начал бросать тот же самый "[BUG] Bus Error ruby 1.8.7 (2009-06-12 patchlevel 174) [i686-darwin10.2.0] ', который вы получаете.
Если я 'sudo gem удалить ruby-debug', тест запускается и проходит. Если я затем 'sudo gem установить ruby-debug' снова, тест бросает.
Я запускаю проект Rails 2,1,1 на Snow Leopard с установленным Ruby 1,8,7 (2009-06-12 patchlevel 174) [i686-darwin10.2.0].
Восстановление драгоценного камня ruby-debug для 64-разрядной версии не устраняет проблему для меня.
-121--2650667-Приятно услышать от вас. -) Я согласен с тем, что мы, как правило, больше внимания уделяем развертыванию апплетов в проекте Pivot. Однако в платформе нет ничего, что мешало бы приложению использовать несколько окон верхнего уровня. Это просто не то, к чему мы относимся, поскольку это не относится к нашему основному варианту использования (который, как вы отметили, является развертыванием браузера). Следует отметить, что также невозможно создать несколько окон верхнего уровня в Flex или Silverlight.
Ре: «Кто создает апплеты в наши дни?» - дело не столько в создании апплетов, сколько в создании РИС. Если задать вопрос «кто создает РИС?», я думаю, что ответом было бы «много людей». Pivot просто позволяет разработчикам создавать RIA на Java (например, вместо ActionScript).
Грег
-121--2805531-pyplot.hist в matplotlib создает гистограмму (но также рисует ее на экране, что может оказаться нежелательным). Только для ячеек можно использовать numpy.histogram, как указано в другом ответе.
Здесь приведен пример сравнения pyploy.hist и numpy.histogram.