有没有办法有条件地索引3D-numpy数组?

时间:2019-04-15 13:30:44

标签: python arrays numpy indexing

具有形状为t = -1:0.0001:1; k = (0:10).'; F = 4/pi.*((1./(2.*(k) + 1)).*sin((2*(k)+1).*pi.*t)); series = sum(F, 1); 的数组A,是否可以基于形状为scp的二进制数组B对其进行索引?

6和60非常随意,它们只是我希望访问的2D数据。

我要做的基本工作是计算2D数据的两个变体(在这种情况下为(2,6, 60)),然后有效地选择总和最低的变量-这就是二进制{{ 1}}数组来自。

示例:对于(6,),我希望收到的金额等于堆叠金额

(6,60)

但是我想通过直接索引而不是for循环来实现。

我尝试了(6,),但没有一个提供所需的(6,60)矩阵。

B = [1,0,1,0,1,0]

预期结果是一个A[1,0,:] A[0,1,:] A[1,2,:] A[0,3,:] A[1,4,:] A[0,5,:] 数组,其中包含如上所述的A中的元素,接收到的是A[B], A[:,B,:], A[B,:,:] A[:,:,B]import numpy as np A = np.array([[4, 4, 4, 4, 4, 4], [1, 1, 1, 1, 1, 1]]) A = np.atleast_3d(A) A = np.tile(A, (1,1,60) B = np.array([1, 0, 1, 0, 1, 0]) A[B]

预先感谢您, 莱纳斯

2 个答案:

答案 0 :(得分:1)

您可以生成要迭代的索引范围,在0到5的情况下:

count = A.shape[1]

indices = np.arange(count)  # np.arange(6) for your particular case

>>> print(indices)
array([0, 1, 2, 3, 4, 5])

然后您可以使用它来进行高级索引编制:

result_array = A[B[indices], indices, :]

如果您始终按递增顺序使用A第二轴的从0到长度-1(即0到5)的整个范围,则可以简化为:

result_array = A[B, indices, :]
# or the ugly result_array = A[B, np.arange(A.shape[1]), :]

甚至总是6:

result_array = A[B, np.arange(6), :]

答案 1 :(得分:0)

使用np.take_along_axis(从版本1.15-docs起)的替代解决方案

import numpy as np
x = np.arange(2*6*6).reshape((2,6,6))
m = np.zeros(6, int)
m[0] = 1
#example: [1, 0, 0, 0, 0, 0]

np.take_along_axis(x, m[None, :, None], 0)   #add dimensions to mask to match array dimensions

>>array([[[36, 37, 38, 39, 40, 41],
        [ 6,  7,  8,  9, 10, 11],
        [12, 13, 14, 15, 16, 17],
        [18, 19, 20, 21, 22, 23],
        [24, 25, 26, 27, 28, 29],
        [30, 31, 32, 33, 34, 35]]])