我有一个像 [[6,7,8],[1,2,3],[1,2,3]]
这样的 3d numpy 数组,我想使用第一个“band"[6,7,8]
作为所有其他“带”的虚值。应该是这样的
[[6,7,8],[1+6j,2+7j,3+,8j],[1+6j,2+7j,3+8j]]
有人知道这是怎么回事吗? 感谢您的帮助!
最佳答案
通常人们将“first band”称为第一行。
>>> arr = np.array([[6,7,8],[1,2,3],[1,2,3]])
#First need a complex datatype.
>>> arr = arr.astype(np.complex)
>>> arr
array([[ 6.+0.j, 7.+0.j, 8.+0.j],
[ 1.+0.j, 2.+0.j, 3.+0.j],
[ 1.+0.j, 2.+0.j, 3.+0.j]])
# .imag and .real access the real and imaginary parts of the array.
>>> arr[1:].imag = arr[0].real
>>> arr
array([[ 6.+0.j, 7.+0.j, 8.+0.j],
[ 1.+6.j, 2.+7.j, 3.+8.j],
[ 1.+6.j, 2.+7.j, 3.+8.j]])
跳过多次转换调用和 vstack 可以节省大量时间:
arr = np.array([[6,7,8],[1,2,3],[1,2,3]])
%timeit a=arr.astype(np.complex);a[1:].imag = a[0].real
100000 loops, best of 3: 4.03 µs per loop
%timeit np.vstack((arr[0,:], arr[1:,:] + arr[0,:] * 1.j))
10000 loops, best of 3: 25.2 µs per loop
对于更大的数组:
arr = np.random.rand(500,500)
%timeit a=arr.astype(np.complex);a[1:].imag = a[0].real
1000 loops, best of 3: 898 µs per loop
In [13]: %timeit np.vstack((arr[0,:], arr[1:,:] + arr[0,:] * 1.j))
1000 loops, best of 3: 1.77 ms per loop
主要区别在于 vstack
选项必须将 arr 转换为复杂数据类型两次。
%timeit arr.astype(np.complex)
1000 loops, best of 3: 530 µs per loop
关于python - 如何使用 3d numpy 数组的第一个波段作为所有其他波段的虚值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19034631/