DigitalMicrograph 中的 CreateImage 错误 (python)
CreateImage Bug in DigitalMicrograph (python)
我在尝试使用 python 在 DigitalMicrograph 中创建图像时似乎遇到了一个非常奇怪的错误。简而言之,我定义了一个包含 32 个 x 和 y 坐标的数组,然后将其重新整形为 2x4x4 矩阵。创建图像时,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 平面 (1x4x4) 中绘制第一个 x 坐标,然后绘制第一个 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
命令引起的。
从documentation可以看出,它默认使用'K'
参数:
‘K’ means match the layout of a as closely as possible.
内存布局在 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' 在这种情况下似乎也有效。)
我在尝试使用 python 在 DigitalMicrograph 中创建图像时似乎遇到了一个非常奇怪的错误。简而言之,我定义了一个包含 32 个 x 和 y 坐标的数组,然后将其重新整形为 2x4x4 矩阵。创建图像时,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 平面 (1x4x4) 中绘制第一个 x 坐标,然后绘制第一个 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
命令引起的。
从documentation可以看出,它默认使用'K'
参数:
‘K’ means match the layout of a as closely as possible.
内存布局在 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' 在这种情况下似乎也有效。)