【问题标题】:numpy: Is there a way to create an array from a sequence of mappings w/o external loop?numpy:有没有办法从不带外部循环的映射序列创建数组?
【发布时间】:2018-07-29 10:14:06
【问题描述】:

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

我有两个 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]

... 由第 1 个映射的第 1 项、第 2 个映射的第 2 项以及第 3 和第 4 映射的第一项组成。

有没有一种精益的方法来单独使用 numpy 功能,无需外部循环,也不会为临时数组占用过多的内存?

【问题讨论】:

  • mapping数组的最后一行有错字:0 → 10
  • 正确,谢谢。我后来修改了映射数组示例以包含更少的模棱两可的值,但错过了在帖子的定义中对其进行调整,抱歉。已更新。
  • 你为什么担心temporary arrays?这不是我们在使用numpy 时应该关注的内容。让口译员处理这些。
  • 不幸的是,我不能拥有无限的内存,我还需要其他程序和变量,而不是随长度呈指数增长的临时批量数组。在一些测试中,对于中等大小的图像,我的(低效率的)临时数组已经变得太大了。在中长期,我的目标是良好的性能,这也受到不必要的大型临时数组的影响。

标签: python arrays numpy indices creation


【解决方案1】:

我认为您正在寻找 numpy 的索引文档中的 this part

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

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

【讨论】:

  • 做了一些小的修改。如果不满意,请随时回复。
  • 太棒了!正是我想要的。开销是可以接受的。但是像广播的长度平方的临时数组这样的东西太多了。
  • 这样做了,只是在寻找“正确答案”之类的文本链接,没想到会被钩。
  • 感谢您更新 nicocos 答案。对我来说,他的原始答案效果很好,其中临时数组基于映射数组的序列长度。索引形状的使用如何改进代码? “高级索引必须具有一致的形状”是什么意思。谢谢
  • 你为什么说arange没用?这种类型的advanced indexing是必需的。
猜你喜欢
  • 2021-08-30
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
相关资源
最近更新 更多