用另一个数组求一个数组 - python

时间:2013-12-20 06:18:46

标签: python arrays numpy indexing sum

我有两个相应的2D阵列,一个是速度,一个是强度。强度值与每个速度元素匹配。

我已经创建了另一个1d数组,它在均匀的bin宽度内从最小速度到最大速度。

如何将我的2d数组中的强度值与我的1d数组中的速度分档相对应。

例如:如果I = 5对应于速度= 101km / s,则将其添加到100 - 105 km / s的箱子中。

这是我的意见:

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)
编辑:我提出了临时解决方案但也许有一种更优雅/更有效的方法来实现它?

两个阵列Vlos和I都是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时曲线的尖峰。据我所知,这不是数据导致我质疑我的方法。 / p>

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

任何进一步的帮助将不胜感激。

1 个答案:

答案 0 :(得分: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]))