【问题标题】:numpy array indexing in multiple dimensions多个维度的numpy数组索引
【发布时间】:2021-08-31 18:50:30
【问题描述】:

我有一个 numpy 数组:

theta = np.random.normal(size = [1000, 30, 80, 10])

我有一个索引数组:

delta = np.empty([1000, 30, 50], dtype = int)
delta[0,:] = np.arange(50) # stand-in for integer indexing

我想使用delta 数组索引theta 数组。也就是说,我想要类似的东西

theta[0,delta[0]]

delta[0,20,11] 关联的条目将是theta[0,20,delta[0,20,11]]。例如,我想退出行索引。我该怎么办?

理想情况下,此输出的形状为[30,50,10][30*50, 10]

我现在正在使用: 我现在正在使用:

theta_unravel = np.repeat(np.arange(30), 50)
theta[0,theta_unravel,delta[0].ravel()]

这似乎有效(提供[30 * 50, 10] 结果),但我不知道这是否是一个理想的解决方案。相反,我不知道这是否是最快的解决方案。

【问题讨论】:

  • 您的delta 没有意义。它具有形状 (3,)。您是说 (1000,30,50) 形状的索引数组吗?具有theta的最后一个维度的有效值?
  • 编辑:是的,我现在明白你的意思了。 doh!.现在,delta 中的值是theta 的第三轴的整数索引。 theta 的第二个轴应该由delta 的第二个轴上的行来推断。所以,根据关系,delta.shape[0] == theta.shape[0]delta.shape[1] == theta.shape[1]delta.max() < theta.shape[2]
  • 顺便说一句,您可以考虑使用np.empty_like(theta),它会创建一个与theta具有相同形状和数据类型的空数组

标签: python numpy indexing


【解决方案1】:

我认为这说明了您正在尝试的内容 - 使用较小的 3d 数组:

In [758]: x = np.arange(24).reshape(3,4,2)
In [759]: y = np.ones((3,3),int)
In [760]: x[np.arange(3)[:,None],np.arange(3),y]
Out[760]: 
array([[ 1,  3,  5],
       [ 9, 11, 13],
       [17, 19, 21]])

y 是 (3,3),其他维度的索引必须广播到相同的形状。

In [761]: x
Out[761]: 
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5],
        [ 6,  7]],

       [[ 8,  9],
        [10, 11],
        [12, 13],
        [14, 15]],

       [[16, 17],
        [18, 19],
        [20, 21],
        [22, 23]]])
In [762]: x[np.arange(3)[:,None],np.arange(3),y]=0
In [763]: x
Out[763]: 
array([[[ 0,  0],
        [ 2,  0],
        [ 4,  0],
        [ 6,  7]],

       [[ 8,  0],
        [10,  0],
        [12,  0],
        [14, 15]],

       [[16,  0],
        [18,  0],
        [20,  0],
        [22, 23]]])

由于我使用ones创建y(懒得做更花哨的事情),所以和:

In [765]: x[:,:,1]
Out[765]: 
array([[ 0,  0,  0,  7],
       [ 0,  0,  0, 15],
       [ 0,  0,  0, 23]])
In [766]: x[:,:3,1]
Out[766]: 
array([[0, 0, 0],
       [0, 0, 0],
       [0, 0, 0]])

要以这种方式使用y,其值必须在最后一个维度的范围内,此处为 2。

【讨论】:

    猜你喜欢
    • 2016-04-05
    • 2015-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2019-11-20
    • 2019-01-04
    • 1970-01-01
    相关资源
    最近更新 更多