从列表列表

时间:2017-06-30 11:03:06

标签: python python-3.x matplotlib nested-lists histogram2d

我试图从两个数据阵列创建一个二维直方图,一个是带有y值范围的列表(rdata),另一个是一个嵌套列表,其中外部列表​​给出了特定时间的强度和内部列表在一个高度范围内的特定时间给出强度。

我尝试使用y轴上的范围值和x轴上的强度值创建二维直方图。我查看了numpy.histogram2d文档,并试图从我用simmpler数组创建的模板文件中重建这个直方图。

附件是代码:

import numpy as np
import file_reader as fr
import matplotlib.pyplot as plt

time = []
rdata = []
intensity = []

fr.file_reader(time, rdata, intensity)
print('TIME DATA:', time)
print('RANGE DATA:', rdata)
print('INTENSITY DATA:', intensity)

range_bins = np.linspace(rdata[0],rdata[1],len(rdata))
intensity_bins = np.linspace(-70,30,len(intensity))
rdata = [rdata]

for i in range((len(time)-1)):
    rdata.append(rdata)

print(rdata)


H, intensity_bins, rdata_bins = np.histogram2d(intensity,rdata,bins=(intensity_bins,range_bins))

X,Y = np.meshgrid(intensity_bins,range_bins)
plt.xlim(intensity_bins[-1])
plt.ylim(range_bins[-1])
plt.pcolormesh(X,Y,H, cmap='Reds')
plt.draw()

file_reader是我创建的一个文件,用于从.txt读取数据,为了简单起见,我将包含数据输出,构建我试图绘制的数组:

TIME DATA: [16.23638916015625, 16.23916625976562, 16.24194526672363, 16.24472236633301, 16.24749946594238, 16.25027847290039, 16.25305557250977]
RANGE DATA: [155.89599609375, 187.0751953125, 218.25439453125, 249.43359375, 280.61279296875, 311.7919921875]
INTENSITY DATA: [[nan, nan, nan, nan, nan, nan], [nan, nan, -59.63091278076172, -49.99733352661133, nan, nan], [nan, 4.0, -3.2, -20.0, -20.0, -20.0], [1.1, nan, nan, nan, nan, nan], [nan, nan, -59.63091278076172, -49.99733352661133, nan, nan], [nan, 4.0, -3.2, -20.0, -20.0, -20.0], [5.32, -29.48, -50.0, -32.2, -1.111, -51.3]]

for i in range(len(time)-1)函数是我测试是否复制范围数据列表所以它是相同的长度并且还包含嵌套的列表集将有助于数据输入到直方图,但是当我运行代码时没有输出,它似乎卡住了,因为我必须按ctrl + c来停止代码运行。在这里坐了十分钟,它没有产生任何输出或完成运行,这是荒谬的,因为这些是小型数据阵列。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

numpy.histogram2D要求XY为每个点的x和y坐标的一维数组。根据您提供的数据输出,您的intensity数组看起来像是2D。此外,当您运行rdata追加循环时,您将附加中间值(即2D)。我已使用ravel函数更改了您的代码,使intensity成为一维数组并使用repeat创建了rdata数组:

import numpy as np
import matplotlib.pyplot as plt

time =[16.23638916015625, 16.23916625976562, 16.24194526672363,
    16.24472236633301, 16.24749946594238, 16.25027847290039, 16.25305557250977]
rdata=[155.89599609375, 187.0751953125, 218.25439453125, 249.43359375,
    280.61279296875, 311.7919921875]
intensity= [[np.NaN, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN], 
    [np.NaN, np.NaN, -59.63091278076172, -49.99733352661133, np.NaN, np.NaN], 
    [np.NaN, 4.0, -3.2, -20.0, -20.0, -20.0], [1.1, np.NaN, np.NaN, np.NaN, np.NaN, np.NaN], 
    [np.NaN, np.NaN, -59.63091278076172, -49.99733352661133, np.NaN, np.NaN],
    [np.NaN, 4.0, -3.2, -20.0, -20.0, -20.0], [5.32, -29.48, -50.0, -32.2, -1.111, -51.3]]


range_bins = np.linspace(rdata[0],rdata[-1],len(rdata))
intensity_bins = np.linspace(-70,30,len(intensity))

intensity = np.array(intensity).ravel()

rdata = np.repeat(rdata,len(time))

H, intensity_bins, range_bins = np.histogram2d(intensity,rdata,
    bins=(intensity_bins,range_bins))

plt.imshow(H, interpolation='nearest', origin='low',
    extent=[intensity_bins[0], intensity_bins[-1],range_bins[0], range_bins[-1]])

Output