我是Python的新手,我正在从头开始用Python编写可视化代码(以避免使用昂贵的专有程序,如IDL).到目前为止,我已经使用过IDL和gnuplot.我想要做的是:
我使用fortran将二维数组写入未格式化的直接访问文件,我希望能够在python中读取.确切的测试代码如下.实际代码是一个巨大的并行代码,但数据输出几乎完全相同的格式.
program binary_out
implicit none
integer :: i,j,t,rec_array
double precision, dimension(100,100) :: fn
double precision, parameter :: p=2*3.1415929
INQUIRE(IOLENGTH=rec_array) fn
open(unit=10,file='test',status='new',form='unformatted',access='direct',recl=rec_array)
fn=0
write(10,rec=1) fn
do t=1,3
do i=1,100
do j=1,100
fn(i,j)=sin(i*p*t/100)*cos(j*p*t/100)
enddo
enddo
write(10,rec=t+1) fn
enddo
close(10)
end program binary_out
Run Code Online (Sandbox Code Playgroud)
该程序应该给我t = 1的零和增加"岛"的数量以增加t的值.但是当我使用下面给出的python代码读取它时,我只是得到了零.如果我删除第一个零的写语句,我只是得到第一次切片,而不管我在python代码中使用的"timeslice"的值.我到目前为止的代码是:
#!/usr/bin/env python
import scipy
import glob
import numpy as np
import matplotlib.pyplot as plt
import os, sys
from pylab import *
def readslice(inputfilename,field,nx,ny,timeslice):
f=open(inputfilename,'r')
f.seek(timeslice*nx*ny)
field=np.fromfile(inputfilename,dtype='d',count=nx*ny)
field=np.reshape(field,(nx,ny))
return field
a=np.dtype('d')
a=readslice('test',a,100,100,2)
im=plt.imshow(a)
plt.show()
Run Code Online (Sandbox Code Playgroud)
如果时间片等于i,我希望def readlice能够在第i个位置读取记录.为此,我试图使用f.seek,但它似乎不起作用.numpy.fromfile似乎开始从第一个记录本身读取.如何让numpy.fromfile从文件中的特定点读取?
我仍然在尝试习惯Python风格并深入研究文档.任何帮助和指示将不胜感激.
我是python的新手,我正试图从文件中读取"块"数据.该文件的内容类似于:
# Some comment
# 4 cols of data --x,vx,vy,vz
# nsp, nskip = 2 10
# 0 0.0000000
# 1 4
0.5056E+03 0.8687E-03 -0.1202E-02 0.4652E-02
0.3776E+03 0.8687E-03 0.1975E-04 0.9741E-03
0.2496E+03 0.8687E-03 0.7894E-04 0.8334E-03
0.1216E+03 0.8687E-03 0.1439E-03 0.6816E-03
# 2 4
0.5056E+03 0.8687E-03 -0.1202E-02 0.4652E-02
0.3776E+03 0.8687E-03 0.1975E-04 0.9741E-03
0.2496E+03 0.8687E-03 0.7894E-04 0.8334E-03
0.1216E+03 0.8687E-03 0.1439E-03 0.6816E-03
# 500 0.99999422
# 1 4
0.5057E+03 0.7392E-03 -0.6891E-03 0.4700E-02
0.3777E+03 0.9129E-03 0.2653E-04 0.9641E-03
0.2497E+03 0.9131E-03 0.7970E-04 0.8173E-03
0.1217E+03 0.9131E-03 0.1378E-03 0.6586E-03
and …Run Code Online (Sandbox Code Playgroud) 我有一个情节,我想让一个面板与其他四个面板分开.我希望四个面板的其余部分共享x轴.该图如下所示.我希望底部四个面板共享x轴.我试过了
f = plt.figure()
ax6=f.add_subplot(511)
ax4=f.add_subplot(515)
ax1=f.add_subplot(512,sharex=ax4)
ax2=f.add_subplot(513,sharex=ax4)
ax3=f.add_subplot(514,sharex=ax4)
Run Code Online (Sandbox Code Playgroud)
但是,这对我不起作用.附图是用
f = plt.figure()
ax6=f.add_subplot(511)
ax4=f.add_subplot(515)
ax1=f.add_subplot(512)
ax2=f.add_subplot(513)
ax3=f.add_subplot(514)
Run Code Online (Sandbox Code Playgroud)
然后将xticks设置为none
ax1.get_xaxis().set_ticklabels([])
ax2.get_xaxis().set_ticklabels([])
ax3.get_xaxis().set_ticklabels([])
Run Code Online (Sandbox Code Playgroud)
使用f.subplots_adjust(hspace = 0)连接所有子图.有没有办法只加入底部的四个面板?
谢谢!
我正在使用numpy和matplotlib来分析我的模拟中的数据输出.有一个(明显的)不一致,我找不到根源.它是以下内容:
我有一个给定能量a ^ 2~1的信号.当我使用rfft进行FFT并计算傅里叶空间中的能量时,它会显着增大.为了无法提供我的数据等细节,这里有一个简单的sin波示例:
from pylab import *
xx=np.linspace(0.,2*pi,128)
a=np.zeros(128)
for i in range(0,128):
a[i]=sin(xx[i])
aft=rfft(a)
print mean(abs(aft)**2),mean(a**2)
Run Code Online (Sandbox Code Playgroud)
原则上两个数字应该是相同的(至少在数字意义上),但这是我从这段代码中得到的:
62.523081632 0.49609375
Run Code Online (Sandbox Code Playgroud)
我试图通过numpy.fft文档,但找不到任何东西.这里的搜索给出了以下内容,但我无法理解那里的解释:
我错过了什么/误解了什么?在这方面的任何帮助/指针将不胜感激.
谢谢!