У меня есть два соответствующих 2D-массива, один из которых имеет скорость, одну из интенсивности. Значения интенсивности соответствуют каждому из элементов скорости.Суммирование одного массива в терминах другого - python
Я создал еще один 1-й массив, который идет от минимальной до максимальной скорости даже в ширину бункера.
Как бы я суммировал значения интенсивности из моего 2d-массива, которые соответствуют моим скоростным ячейкам в моем 1-мерном массиве.
Например: если I I = 5, соответствующая скорости = 101 км/с, то это добавляется в бункер 100 - 105 км/с.
Вот мой вклад:
rad = np.linspace(0, 3, 100) # polar coordinates
phi = np.linspace(0, np.pi, 100)
r, theta = np.meshgrid(rad, phi) # 2d arrays of r and theta coordinates
V0 = 225 # Velocity function w/ constants.
rpe = 0.149
alpha = 0.003
Vr = V0 * (1 - np.exp(-r/rpe)) * (1 + (alpha * np.abs(r)/rpe)) # returns 100x100 array of Velocities.
Vlos = Vr * np.cos(theta)# Line of sight velocity assuming the observer is in the plane of the polar disk.
a = (r**2) # intensity as a function of radius
b = (r**2/0.23)
I = (3.* np.exp(-1. * a)) - (1.8 * np.exp(-1. * b))
Я хотел бы сначала создать скорости бункеров от Vmin до Vmax, а затем просуммировать интенсивности над каждым бункером.
Мой желаемый из пут будет что-то вдоль линий
V_bins = [0, 5, 10,... Vlos.max()]
I_sum = [1.4, 1.1, 1.8, ... 1.2]
plot(V_bins, I_sum)
EDIT: я пришел с временным решением, но, возможно, есть более элегантный/эффективный метод ее достижения?
Два массива Vlos и я - это 100 на 100 матриц.
Vlos = array([[ 0., 8.9, 17.44, ..., 238.5],...,
[-0., -8.9, -17.44, ..., -238.5]])
I = random.random((100, 100))
V = np.arange(Vlos.min(), Vlos.max()+5, 5)
bins = np.zeros(len(V))
for i in range(0, len(V)-1):
for j in range(0, len(Vlos)): # horizontal coordinate in matrix
for k in range(0, len(Vlos[0])): # vert coordinate
if Vlos[j,k] >= V[i]and Vlos[j,k] < V[i+1]:
bins[i] = bins[i] + I[j,k]
Результат показан ниже. Ожидаемая общая фигура в гистограмме, однако я не понимаю всплеск кривой при V = 0. Насколько я могу судить об этом, нет данных, которые приводят меня к вопросу о моем методе.
Любая дополнительная помощь будет оценена.
1. Что вы пробовали? 2. Пожалуйста, покажите пример того, что вы пытаетесь сделать, иначе это трудно понять. – sashkello
Что вы ищете, это [дерево интервалов] (http://en.wikipedia.org/wiki/Interval_tree). См. [Этот ответ] (http://stackoverflow.com/questions/4014242/python-dynamic-interval-data-structure) для получения дополнительной информации. –
Укажите код, который создает пример ввода и записывает желаемый результат как можно точнее. – cyborg