【问题标题】:Modifying a 3d array using a 2D index with Numpy使用带有 Numpy 的 2D 索引修改 3d 数组
【发布时间】:2021-03-28 11:30:33
【问题描述】:

我有一个三维(a,b,c)的数组,我需要修改二维(a,b)数组索引的位置c。

我编写了一个按预期工作的代码,但有谁知道是否有办法在不使用 for 循环的情况下解决这个问题?

import numpy as np
arr = np.random.randn(100, 5, 2)
mod = np.random.randn(100, 5)
ids = np.random.randint(0, 2, size=[100,5])
for i in range(100):
    for j in range(5):
        arr[i,j,ids[i,j]] = mod[i,j]

【问题讨论】:

  • 嗨。我不明白ids = np.random.randint(0, 2, size=[100,5]) 是如何帮助你的。它会生成一个随机填充 0 和 1 的二维数组,然后您可以使用它来定义分配给哪个切片 mod[i, j]。所以简而言之,当您在最后一行分配mod[i, j] 时,您将其随机分配给指向[i,j,0][i,j,1] 您是故意这样做的吗?如果是这样,我不明白您要做什么,所以我的答案可能不是您要找的。如果这不是错误,您能否编辑您的答案以澄清您的问题?谢谢。
  • 嗨。感谢您的关注。该代码只是我的问题的简化。我将 arr、mod 和 ids 定义为随机的,以便能够作为示例运行。简短的故事是我在机器学习中使用进化算法,我的代码需要很长时间才能完成,因为代数太大了。然后,我试图通过消除循环来优化它。在这种情况下,我需要根据 id 更改 arr 将 mod 放入位置。如果我得到这个,我将消除我的代码中的许多循环。我现在正在阅读您答案中的链接。

标签: arrays python-3.x numpy multidimensional-array


【解决方案1】:

您可以直接引用和设置数组的每个slice。我认为这段代码显示了您所询问的行为:

import numpy as np

arr = np.array([[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]])
print(arr[:,:,2])
# Output: 
#[[ 3  6]
# [ 9 12]]

new2DSlice = np.array([[23, 26], [29, 32]])
arr[:,:,2] = new2DSlice
print(arr[:,:,2])
# Outupt:
#[[23 26]
# [29 32]]

arr[:,:,2] 引用数组的第三个切片,在本例中,直接设置它。

您可以在 W3Schools 上阅读 NumPy 的 array indexingarray slicing

【讨论】:

    【解决方案2】:

    我明白了:

    import numpy as np
    arr = np.random.randn(100, 5, 2)
    mod = np.random.randn(100, 5)
    ids = np.random.randint(0, 2, size=[100,5])
    x = np.arange(100)
    y = np.arange(5)
    arr[x[:,None],y,ids] = mod
    

    【讨论】:

      猜你喜欢
      • 2019-12-23
      • 1970-01-01
      • 2018-03-08
      • 2018-04-06
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 2023-03-30
      • 1970-01-01
      相关资源
      最近更新 更多