使用2-D阵列切割3-D阵列

时间:2015-09-01 03:25:55

标签: python arrays numpy

假设我们有两个矩阵:

x = np.random.randint(10, size=(2, 3, 3))
idx = np.random.randint(3, size=(2, 3))

问题是使用x访问idx的元素,方式如下:

dim1 = x[0, range(0,3), idx[0]]  # slicing x[0] using idx[0]
dim2 = x[1, range(0,3), idx[1]]
res = np.vstack((dim1, dim2))

有没有一种巧妙的方法可以做到这一点?

2 个答案:

答案 0 :(得分:1)

您只需将basic way编入索引,只需将索引器数组的大小匹配即可。这就是那些.reshape的用途:

x[np.array([0,1]).reshape(idx.shape[0], -1), 
  np.array([0,1,2]).reshape(-1,idx.shape[1]),
  idx]
Out[29]: 
array([[ 0.10786251,  0.2527514 ,  0.11305823],
       [ 0.67264076,  0.80958292,  0.07703623]])

答案 1 :(得分:1)

以下是使用reshaping -

执行此操作的另一种方法
x.reshape(-1,x.shape[2])[np.arange(idx.size),idx.ravel()].reshape(idx.shape)

示例运行 -

In [2]: x
Out[2]: 
array([[[5, 0, 9],
        [3, 0, 7],
        [7, 1, 2]],

       [[5, 3, 5],
        [8, 6, 1],
        [7, 0, 9]]])

In [3]: idx
Out[3]: 
array([[2, 1, 2],
       [1, 2, 0]])

In [4]: x.reshape(-1,x.shape[2])[np.arange(idx.size),idx.ravel()].reshape(idx.shape)
Out[4]: 
array([[9, 0, 2],
       [3, 1, 7]])