Python:从3d numpy数组中的2d数组访问已保存的点

时间:2019-03-09 15:40:10

标签: python arrays numpy

我有一个2d numpy数组(shape(y,x)=601,1200)和一个3d numpy数组(shape(z,y,x)=137,601,1200)

在2d数组中,我将z值保存在y, x点,现在我想从3d数组访问该值并将其保存到新的2d数组中。

我尝试了类似的尝试,但没有成功。

levels = array2d.reshape(-1)
y = np.arange(601)
x = np.arange(1200)
newArray2d=oldArray3d[levels,y,x]
  

IndexError:形状不匹配:索引数组无法与形状(721200,)(601,)(1200,)一起广播

我不想尝试使用循环,所以有没有更快的方法?

2 个答案:

答案 0 :(得分:0)

您的问题中有些含糊,但我想您想像这样进行高级索引编制:

In [2]: arr = np.arange(24).reshape(4,3,2)                                      
In [3]: levels = np.random.randint(0,4,(3,2))                                   
In [4]: levels                                                                  
Out[4]: 
array([[1, 2],
       [3, 1],
       [0, 2]])
In [5]: arr                                                                     
Out[5]: 
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 [6]: arr[levels, np.arange(3)[:,None], np.arange(2)]                         
Out[6]: 
array([[ 6, 13],
       [20,  9],
       [ 4, 17]])

levels是(3,2)。我创建了其他两个索引数组,它们分别与它们一起广播(3,1)和(2,)。结果是arr中的(3,2)个值数组,由它们的组合索引选择。

答案 1 :(得分:0)

这是您拥有的数据:

x_len = 12     # In your case, 1200
y_len = 6      # In your case, 601
z_len = 3      # In your case, 137

import numpy as np
my2d = np.random.randint(0,z_len,(y_len,x_len))
my3d = np.random.randint(0,5,(z_len,y_len,x_len))

这是构建新2d数组的一种方法:

yindices,xindices = np.indices(my2d.shape)
new2d = my3d[my2d[:], yindices, xindices]

注释:

  1. 我们正在使用Integer Advanced Indexing。
  2. 这意味着我们用3个整数索引数组对3d数组my3d进行索引。
  3. 有关整数数组索引工作原理的更多说明,请参阅my answer on this other question
  4. 在您的尝试中,无需使用reshape(-1)重塑2d形状,因为我们传递的整数索引数组的形状将(在任何广播之后)变成所得2d数组的形状。 / li>
  5. 此外,在尝试中,第二个和第三个索引数组需要具有相反的方向。也就是说,它们的形状必须为(y_len,1)(1, x_len)。请注意1的不同位置。这样可以确保广播这两个索引数组