如何选择具有(n-1)D个轴索引的nD阵列轴上的值?

cge

这是我在这里回答的动机

给定形状为(n0,n1)的数组A和形状为(n0)的数组J,我想创建形状为(n0)的数组B

B[i] = A[i,J[i]]

我也想将其推广到k维数组,其中A具有形状(n0,n1,...,nk),J具有形状(n0,n1,...,n(k-1))

有一些混乱的,扁平化的方法可以对索引顺序进行假设:

import numpy as np
B = A.ravel()[   J+A.shape[-1]*np.arange(0,np.prod(J.shape)).reshape(J.shape) ]

问题是,有没有一种方法不依赖于展平数组和手动处理索引?

hpaulj

对于2d和1d情况,此索引有效:

A[np.arange(J.shape[0]), J]

可以通过重塑为2d(并向后)将其应用于更多尺寸:

A.reshape(-1, A.shape[-1])[np.arange(np.prod(A.shape[:-1])).reshape(J.shape), J]

对于3d,A此方法有效:

A[np.arange(J.shape[0])[:,None], np.arange(J.shape[1])[None,:], J]

其中1st 2arange索引的广播尺寸与相同J

使用中的函数时lib.index_tricks,可以表示为:

A[np.ogrid[0:J.shape[0],0:J.shape[1]]+[J]]
A[np.ogrid[slice(J.shape[0]),slice(J.shape[1])]+[J]]

或用于多个维度:

A[np.ix_(*[np.arange(x) for x in J.shape])+(J,)]
A[np.ogrid[[slice(k) for k in J.shape]]+[J]]

对于小的AJ(例如,2 * 3 * 4),J.choose(np.rollaxis(A,-1))速度更快。所有额外的时间都在准备索引元组中。np.ix_比快np.ogrid

np.choose有大小限制。在最高端它比ix_

In [610]: Abig=np.arange(31*31).reshape(31,31)
In [611]: Jbig=np.arange(31)
In [612]: Jbig.choose(np.rollaxis(Abig,-1))
Out[612]: 
array([  0,  32,  64,  96, 128, 160, ... 960])

In [613]: timeit Jbig.choose(np.rollaxis(Abig,-1))
10000 loops, best of 3: 73.1 µs per loop
In [614]: timeit Abig[np.ix_(*[np.arange(x) for x in Jbig.shape])+(Jbig,)]
10000 loops, best of 3: 22.7 µs per loop
In [635]: timeit Abig.ravel()[Jbig+Abig.shape[-1]*np.arange(0,np.prod(Jbig.shape)).reshape(Jbig.shape) ]
10000 loops, best of 3: 44.8 µs per loop

我在https://stackoverflow.com/a/28007256/901925上做了类似的索引测试,发现flat对于更大的数组(例如n0=1000索引速度更快那是我了解的32个限制的地方choice

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何选择具有最大第 n 个元素的向量

如何在具有多索引的数据框中选择具有 1:1 索引的值?

如何选择具有唯一列值的 N 个最近的行

如何选择具有相同值的记录?

如何选择具有给定值的行

如何选择具有相似值的行?

如何从Pandas DataFrame中的每个组中选择具有最高值的N行

如何仅选择包含具有超过N个元素的数组的对象

如何在SQL中选择具有至少N个相似外键的文档

如何在SQL中选择具有特定条件的n%个随机行?

JPA @OneToOne选择具有N + 1个查询的列表

熊猫-沿非索引轴连接两个df,合并非索引轴上具有相同值的行

如何在SQL数据库表中具有单独值的字段中选择第n个项目?

在Excel中,如何确保命名范围中的N个随机选择的列在每行中都具有唯一值?

当我需要选择具有 y 的值(如果它同时具有 y、n 值和 n 值仅在没有 y 值时)时如何从表中选择不同的值

MySQL选择具有特定值的不同的N行

选择具有不同列值的最后N行

如果所有值都低于测试,则替换3D阵列的行-使用索引建立1个numpy行

纯CSS:选择具有n个或更多同胞的元素

如何选择具有所有“列”值且具有相同值的行?

查询难题-如何选择具有后备值的值?

如何选择具有特定值的特定JSON对象?

如何选择具有最大值的行?

如何选择表中具有重复值的行?

如何选择多列具有相同值的行

如何选择具有更多条件的 uniq 哈希值

如何从具有值的行中选择数据

XPath-如何选择具有多个属性值的节点?

SQL如何选择具有特定值的最新记录