我有两个相应的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>
任何进一步的帮助将不胜感激。
答案 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]))