python - DigitalMicrograph(python)中的CreateImage错误。
我在使用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'命令似乎也是可行的。)