2013-12-20 6 views
2

У меня есть два соответствующих 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. Насколько я могу судить об этом, нет данных, которые приводят меня к вопросу о моем методе.

I don't expect the spike at zero and I would expect a smoother curve

Любая дополнительная помощь будет оценена.

+1

1. Что вы пробовали? 2. Пожалуйста, покажите пример того, что вы пытаетесь сделать, иначе это трудно понять. – sashkello

+0

Что вы ищете, это [дерево интервалов] (http://en.wikipedia.org/wiki/Interval_tree). См. [Этот ответ] (http://stackoverflow.com/questions/4014242/python-dynamic-interval-data-structure) для получения дополнительной информации. –

+2

Укажите код, который создает пример ввода и записывает желаемый результат как можно точнее. – cyborg

ответ

3
import numpy as np 
bins = np.arange(100,120,5) 
velocities = np.array([101, 111, 102, 112]) 
intensities = np.array([1,2,3,4]) 
h = np.histogram(velocities, bins, weights=intensities) 
print h 

Выход:

(array([4, 0, 6]), array([100, 105, 110, 115])) 
+0

Я мог бы использовать этот метод, если бы знал, как суммировать интенсивности с использованием соответствующих скоростей. Существует ли метод (возможно, с использованием индексации?) Суммирующих элементов массива интенсивности по отношению к массиву скоростей. – smashbro

+0

Это то, что делает гистограмма. Если вы хотите что-то еще, пожалуйста, покажите нам конкретный пример с номерами ввода и вывода. Добавление уравнений затруднит нам задачу. – cyborg

Смежные вопросы