具有形状为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]
。
预先感谢您, 莱纳斯
答案 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]]])