我理解通过Sort N-D numpy array by another 1-D array使用花式索引,我可以执行以下c = a[:, :, b]
b
定义我想按列排序的顺序
>>> a = np.array([[[ 0, 1], [ 2, 3]],
[[ 4, 5], [ 6, 7]],
[[ 8, 9], [10, 11]]])
>>> b = np.array([1, 0])
>>> c = a[:, :, b]
>>> c
array([[[ 1, 0],
[ 3, 2]],
[[ 5, 4],
[ 7, 6]],
[[ 9, 8],
[11, 10]]])
现在,我向b
增加了b2
个a
,与我>>> b2 = np.array([[1, 0], [0, 1], [1, 0]])
>>> c2 = ?
>>> c2
array([[[ 1, 0],
[ 3, 2]],
[[ 4, 5],
[ 6, 7]],
[[ 9, 8],
[11, 10]]])
c2 = ?
我有一组更大的输入,我有一个函数返回一个类似于' b2'的数组。它为我提供了我应该获得的信息。因此,我可以知道我应该填写b=[10,11,14,9];
a=[13,10,18,11];
tic
c = a > b;
for i=1:14166133
if any(c)
end
end
toc
以获得所需的结果吗?
答案 0 :(得分:5)
这是花式索引 -
的一种方法(a[np.arange(a.shape[0])[:,None],:,b2]).transpose(0,2,1)
示例运行 -
In [191]: a
Out[191]:
array([[[7, 8, 5, 2, 0],
[6, 7, 0, 7, 1],
[7, 6, 5, 4, 0]],
[[8, 0, 5, 5, 7],
[4, 3, 4, 0, 1],
[8, 6, 3, 2, 4]],
[[3, 2, 7, 3, 7],
[4, 3, 0, 1, 5],
[4, 3, 7, 8, 7]]])
In [192]: b2
Out[192]:
array([[1, 2, 4, 3, 0],
[4, 2, 0, 1, 3],
[1, 3, 4, 0, 2]])
In [193]: (a[np.arange(a.shape[0])[:,None],:,b2]).transpose(0,2,1)
Out[193]:
array([[[8, 5, 0, 2, 7],
[7, 0, 1, 7, 6],
[6, 5, 0, 4, 7]],
[[7, 5, 8, 0, 5],
[1, 4, 4, 3, 0],
[4, 3, 8, 6, 2]],
[[2, 3, 7, 3, 7],
[3, 1, 5, 4, 0],
[3, 8, 7, 4, 7]]])
答案 1 :(得分:1)
如果没有人找到纯粹的花式索引解决方案,这里就是循环第一轴的解决方案:
if random_string == 5:
sys.stdout.write(my_random_string(2))
sys.stdout.flush()
time.sleep(0.1)
for _ in range(2):
sys.stdout.write('\b \b')
sys.stdout.flush()
time.sleep(0.1)
答案 2 :(得分:1)
与@Divakar's
解决方案类似,但没有transpose
。
In [259]: I,J, K = np.ogrid[:3,:2,:2]
In [260]: a[I, J, b[:,None,:]]
Out[260]:
array([[[ 1, 0],
[ 3, 2]],
[[ 4, 5],
[ 6, 7]],
[[ 9, 8],
[11, 10]]])
我使用ogrid
(或np.ix_
)作为生成2个3d阵列的紧凑方式,与b[:,None,:]
一起广播以生成一组(3,2,2)
个索引
与完整Nones
相当的是:
a[np.arange(3)[:,None,None], np.arange(2)[None,:,None], b[:,None,:]]
(这使b
选择沿第一轴和最后一轴的项目更清楚)
要查看完整的广播索引数组,请打印:
np.broadcast_arrays(I,J,b[:,None,:])