9阅网

您现在的位置是:首页 > 知识 > 正文

知识

python - DigitalMicrograph(python)中的CreateImage错误。

admin2022-11-07知识23

我在使用python在DigitalMicrograph中创建图像时似乎遇到了一个非常奇怪的错误。简而言之,我定义了一个数组,里面有32个x和y坐标,然后我把它们重塑成一个2x4x4的矩阵,当创建图像时,DM会在x平面上绘制交替的x和y坐标。当创建图像时,DM就会在x平面上交替绘制x-和y-坐标。我觉得用这个MWE来描述是最好的。

import numpy as np

num1 = np.arange(32.)
num1 = num1.reshape((2,4,4))
print(f'num1: {num1}')


num2 = np.zeros((16,2))
for i in range(16):
    num2[i, :] = i, i+16
num2 = num2.reshape((4,4,2))
num2 = np.copy(np.transpose(num2, (2, 0, 1)))
print(f'num2: {num2}')

print(f"Are the arrays equal? {np.array_equal(num1, num2)}" )

print(f'num1 shape: {num1.shape}')
print(f'num2 shape: {num2.shape}')

img1 = DM.CreateImage(np.copy(num1))
img1.ShowImage()

img2 = DM.CreateImage(np.copy(num2))
img2.ShowImage()

del img1
del img2

num2展示了这个错误--图像中可见条纹。DM在x平面上绘制第一个x坐标(1x4x4),然后绘制第一个y坐标,并继续交替,直到填满所有位置。如果我从这个图像中得到数组,得到的数组与我传递给CreateImage函数的数组不同。

相比之下,num1创建的是 一模一样 原先的数组,被传递给同一个函数,但被绘制成预期的样子。

脚本的输出是。

num1: [[[ 0.  1.  2.  3.]
  [ 4.  5.  6.  7.]
  [ 8.  9. 10. 11.]
  [12. 13. 14. 15.]]

 [[16. 17. 18. 19.]
  [20. 21. 22. 23.]
  [24. 25. 26. 27.]
  [28. 29. 30. 31.]]]
num2: [[[ 0.  1.  2.  3.]
  [ 4.  5.  6.  7.]
  [ 8.  9. 10. 11.]
  [12. 13. 14. 15.]]

 [[16. 17. 18. 19.]
  [20. 21. 22. 23.]
  [24. 25. 26. 27.]
  [28. 29. 30. 31.]]]
Are the arrays equal? True
num1 shape: (2, 4, 4)
num2 shape: (2, 4, 4)

可能是内存问题?有人遇到过这种情况吗?



【回答】:

你所遇到的问题是由于Numpy的 copy 命令。文件 可以看出,它使用的是 'K' 参数为默认值。

'K'表示匹配 a 尽可能的接近。

在Python脚本中,内存布局并不重要(似乎),但在创建映射到同一连续内存部分的DM图像时,它肯定是重要的。

这也是为什么要用 copy 是首先需要的。

如果您更换

img1 = DM.CreateImage(np.copy(num1))
img1.ShowImage()

img2 = DM.CreateImage(np.copy(num2))
img2.ShowImage()

img1 = DM.CreateImage(np.copy(num1, order = 'C'))
img1.ShowImage()

img2 = DM.CreateImage(np.copy(num2, order = 'C'))
img2.ShowImage()

事情是固定的。(在这种情况下,'A'命令似乎也是可行的。)