5

我有一个 3d numpy 数组[[6,7,8],[1,2,3],[1,2,3]],我想使用第一个“带”[6,7,8]作为所有其他“带”的虚值。应该是这样的

[[6,7,8],[1+6j,2+7j,3+,8j],[1+6j,2+7j,3+8j]]

有人知道这是怎么回事吗?感谢帮助!

4

2 回答 2

4

通常人们将“第一乐队”作为第一行。

>>> 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
于 2013-09-26T17:36:39.093 回答
3

一种紧凑的解决方案。

>>> a = np.array([[6,7,8],[1,2,3],[1,2,3]])
>>> np.vstack((a[0,:], a[1:,:] + a[0,:] * 1.j))
 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]])

考虑到新数组是复杂的,所以你的第一行包含复杂的值(虚部为零),这是因为数组中的所有元素必须是相同的类型。

于 2013-09-26T17:40:24.627 回答