gpt4 book ai didi

python - 将 numpy 数组保存为二进制以从 FORTRAN 读取

转载 作者:太空宇宙 更新时间:2023-11-03 15:01:05 43 4
gpt4 key购买 nike

我有一系列 numpy 数组,我需要将这些 numpy 数组作为原始二进制 float32(没有任何头信息)循环保存,需要从 FORTRAN 中读取。

import numpy as np
f=open('test.bin','wb+')
for i in range(0,10):
np_data=np.random.rand(10,5)
fortran_data=np.asfortranarray(np_data,'float32')
fortran_data.tofile(f)

f.close()

这是正确的方法吗,这样我就可以从 FORTRAN 中正确读取这个用 python 创建的二进制文件。我们将不胜感激您的建议

最佳答案

你写的代码几乎是正确的,但是 .tofile 方法总是按照 C 顺序编写向量。我不知道为什么 np.asfortranarray() 在写入二进制文件时避免了这种情况,但我测试过,不幸的是我们需要在写入之前转置矩阵以在 Fortran 中正确读取而没有任何其他问题(这意味着在 Fortran 中您可以给出实际的矩阵维数而不需要任何转置)。下面的代码是用 3D 矩阵(我通常需要使用)来说明我在说什么:

a = np.arange(1,10*3*4+1)
b = a.reshape(10,12,order='F')
array([[ 1, 11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 111],
[ 2, 12, 22, 32, 42, 52, 62, 72, 82, 92, 102, 112],
[ 3, 13, 23, 33, 43, 53, 63, 73, 83, 93, 103, 113],
[ 4, 14, 24, 34, 44, 54, 64, 74, 84, 94, 104, 114],
[ 5, 15, 25, 35, 45, 55, 65, 75, 85, 95, 105, 115],
[ 6, 16, 26, 36, 46, 56, 66, 76, 86, 96, 106, 116],
[ 7, 17, 27, 37, 47, 57, 67, 77, 87, 97, 107, 117],
[ 8, 18, 28, 38, 48, 58, 68, 78, 88, 98, 108, 118],
[ 9, 19, 29, 39, 49, 59, 69, 79, 89, 99, 109, 119],
[ 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120]])

b 已经在 Fortran 顺序中

c=b.reshape(10,3,4, order='F')
print(c[:,:,0])
[[ 1 11 21]
[ 2 12 22]
[ 3 13 23]
[ 4 14 24]
[ 5 15 25]
[ 6 16 26]
[ 7 17 27]
[ 8 18 28]
[ 9 19 29]
[10 20 30]]

然后我将矩阵 c 保存在一个二进制文件中:

c.T.tofile('test_c.bin')

因此,使用此 Fortran 代码,我能够以正确的顺序读取二进制数据,我在 Python 中创建了 c 矩阵:

PROGRAM read_saved_python
IMPLICIT NONE

INTEGER(KIND=8),ALLOCATABLE :: matrix(:,:,:)
INTEGER :: Nx, Ny, Nz

Nx = 10
Ny = 3
Nz = 4


ALLOCATE(matrix(Nx, Ny, Nz))


OPEN(33, FILE="/home/victor/test_c.bin",&
FORM="UNFORMATTED", STATUS="UNKNOWN", ACTION="READ", ACCESS='STREAM')

READ(33) matrix


write(*,*) matrix(:,1,1)


CLOSE(33)
DEALLOCATE(matrix)

END PROGRAM read_saved_python

请注意,在 Fortran 中,索引从 1 开始,print 按列顺序显示(在本例中:打印第一列,然后是第二列,然后是第三列)。如果你不在此处转置矩阵 c.T.tofile('test_c.bin') 在 Fortran 中阅读时你会注意到矩阵不是你想要的,即使你使用函数 np.asfortranarray 和你一样(我什至尝试过 np.asfortranarray(c).T.tofile('/home/victor/teste_d.bin') (只是为了确定)但是矩阵在二进制文件中以 c 顺序写入。

关于python - 将 numpy 数组保存为二进制以从 FORTRAN 读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37905759/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com