小编toy*_*las的帖子

在Python中读取直接访问fortran无格式文件

我是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 fortran file

5
推荐指数
1
解决办法
7046
查看次数

从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)

python numpy block

5
推荐指数
1
解决办法
1万
查看次数

Pylab - 调整某些子图的hspace

我有一个情节,我想让一个面板与其他四个面板分开.我希望四个面板的其余部分共享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)连接所有子图.有没有办法只加入底部的四个面板?

谢谢! 在此输入图像描述

python matplotlib

5
推荐指数
1
解决办法
4390
查看次数

(numpy)FFT'd阵列的幅度(?)错误?

我正在使用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文档,但找不到任何东西.这里的搜索给出了以下内容,但我无法理解那里的解释:

现有(合成)信号与滤波信号之间的大FFT幅度差

我错过了什么/误解了什么?在这方面的任何帮助/指针将不胜感激.

谢谢!

python numpy fft amplitude

4
推荐指数
1
解决办法
7986
查看次数

标签 统计

python ×4

numpy ×2

amplitude ×1

block ×1

fft ×1

file ×1

fortran ×1

matplotlib ×1