首页 > 解决方案 > 通过高级索引进行 numpy 掩码分配

问题描述

所以我正在学习 numpy,在这本书中有一个问题告诉我创建三个数组 Z、M 和 C。在我的 Z 数组中,我想创建一个 (4,5) 维数组,而我的 M 数组是一个布尔掩码数组,其大小相同 (4,5) 但为 True,其中 M = abs(Z) < 2 My C 数组的大小也相同但仅包含复数 C = np.full(Z.shape, (-0.4 + 0.6j), dtype=complex)

现在我的三个数组如下

[[2.23606798 1.41421356 1.         1.41421356 2.23606798]
 [2.02758751 1.05409255 0.33333333 1.05409255 2.02758751]
 [2.02758751 1.05409255 0.33333333 1.05409255 2.02758751]
 [2.23606798 1.41421356 1.         1.41421356 2.23606798]]

[[False  True  True  True False]
 [False  True  True  True False]
 [False  True  True  True False]
 [False  True  True  True False]]

[[-0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j]
 [-0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j]
 [-0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j]
 [-0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j -0.4+0.6j]]

将拼写错误从乘 C 更改为添加 C

现在这是我的问题。我想将我的 Z 数组中的每个元素自己相乘,然后将它们与 C 相加,其中所有 M 数组元素都是 True 所以我会使用Z[M] 但是当我尝试将它相乘时,由于 Z 数组变为一维数组,我不知道该怎么做。我需要我的数组形状相同,我只想在 M 元素为真的情况下增加 Z 元素而不改变 Z 数组的尺寸

Z数组的正确最终输出应该是书后的这个

[[-2.        -1.j         -0.4       +2.6j        -1.4       +0.6j
  -0.4       -1.4j         2.        -1.j        ]
 [-2.        -0.33333333j  0.48888889+1.26666667j -0.51111111+0.6j
   0.48888889-0.06666667j  2.        -0.33333333j]
 [-2.        +0.33333333j  0.48888889-0.06666667j -0.51111111+0.6j
   0.48888889+1.26666667j  2.        +0.33333333j]
 [-2.        +1.j         -0.4       -1.4j        -1.4       +0.6j
  -0.4       +2.6j         2.        +1.j        ]]

标签: pythonarrayspython-3.xnumpy

解决方案


IIUC,你可以这样做:z * z * c * m

m中,所有 False 值都表示为 0,所有 True 值都表示为 1。你可以看到这个m * 1


推荐阅读