Python numpy:有没有一种方法可以从一系列映射中创建一个数组,而不需要外部循环?

Python numpy:有没有一种方法可以从一系列映射中创建一个数组,而不需要外部循环?,python,arrays,numpy,indices,creation,Python,Arrays,Numpy,Indices,Creation,对我来说,这听起来像是一个常见的用例,但我还没有找到合适的函数/线程 我有两个numpy数组,一个是三元组序列,另一个是相关的索引序列。我想创建一个具有相等序列长度的一维数组,由映射项根据其索引组成 例如: mapping = np.array(((25, 120, 240), (18, 177, 240), (0, 0, 0), (10, 120, 285))) indices = np.array((0, 1, 0, 0)) print "mapping:", mapping print

对我来说,这听起来像是一个常见的用例,但我还没有找到合适的函数/线程

我有两个numpy数组,一个是三元组序列,另一个是相关的索引序列。我想创建一个具有相等序列长度的一维数组,由映射项根据其索引组成

例如:

mapping = np.array(((25, 120, 240), (18, 177, 240), (0, 0, 0), (10, 120, 285)))
indices = np.array((0, 1, 0, 0))

print "mapping:", mapping
print "indices:", indices
print "mapped:", mapping[indices]
将生成以下输出:

mapping: [[ 25 120 240]
 [ 18 177 240]
 [  0   0   0]
 [  10 120 285]]
indices: [0 1 0 0]
mapped: [[ 25 120 240]
 [ 18 177 240]
 [ 25 120 240]
 [ 25 120 240]]
当然,这种方法将整个映射数组视为一个映射,而不是映射列表,根据索引数组,只返回第一个或第二个内部映射。但我想要的是:

mapped: [25 177 0 10]
。。。由第一次映射的第一项、第二次映射的第二项以及第三次和第四次映射的第一项组成


是否有一种简单的方法可以单独使用numpy功能,而不需要外部循环,也不需要为临时阵列使用过多的内存?

我想您正在寻找numpy关于索引的文档

In [17]: mapping[(np.arange(indices.shape[-1]),indices)]
Out[17]: array([ 25, 177,   0,   10])

这将创建一个临时数组(
np.arange
),但它是一维的,我想不出更好的了。

映射的最新一行中有一个打字错误数组:0→ 请更正,谢谢。后来我修改了MappingArray示例,使其包含更少的不明确值,但没有在文章的定义中对其进行调整,对不起。已更新。您为什么担心
临时数组
?这不是我们在使用
numpy
时应该关注的。让解释器来处理这些问题。不幸的是,我不能拥有无限的内存,我还需要其他程序和变量的内存,而不是临时大容量数组,它们随长度呈指数增长。在一些测试中,对于中等大小的映像,我的(不有效)临时数组变得太大。从中长期来看,我的目标是获得良好的性能,这也会受到不必要的大型临时阵列的影响。我做了一些小的修改。如果不高兴,请随时回复。太好了!正是我想要的。开销是可以接受的。但是像广播的长度平方临时数组这样的东西太多了。这样做,只是在寻找一个像“正确答案”这样的文本链接,不希望出现钩子。感谢您更新nicocos答案。对我来说,他的原始答案非常有效,其中临时数组基于映射数组的序列长度。使用索引形状如何改进代码?以及“高级索引必须具有一致的形状”是什么意思“.thx为什么您将
arange
描述为无用?这是此类
高级索引所必需的。