【问题标题】:Smart Indexing with numpy使用 numpy 进行智能索引
【发布时间】:2019-12-06 05:01:35
【问题描述】:

我有一个 4 维数组(命名为颜色),它为每个 3d 点 (x, y, z) -> (r, g, b) 分配颜色(即 3 个值 R、G、B) 我有另一个二维数组(命名为可见),它告诉我当我俯视它时我可以看到哪个 z 窗格 (x, y)->z 我想创建 3 维数组(视图),它告诉我我看到了什么。 (x, y) -> (r, g, b)

如何使用 numpy 智能索引来做到这一点?

我试过了

colors=np.array([
  [
  [[0, 0, 0], [1, 0, 0]],
  [[0, 1, 0], [0, 0, 1]]],

  [
  [[1, 0, 1], [1, 1, 0]],
  [[0, 1, 1], [1, 1, 1]]]])

visible=np.array(
  [[0, 1],
   [1, 0]])

view=colors[:, :,visible[:, :]]

expected=np.array(
[[[0, 0, 0], [1, 1, 0]],
 [[0, 1, 1], [0, 0, 1]]])

但这给了我 5 维数组。

【问题讨论】:

  • 您能否更好地解释一下您想要实现的目标,不清楚为什么0 变成[0, 0, 0]
  • 你的expected 的最后一个元素不是错误的吗?
  • @John Zwick:你是对的。我在问题中更正了预期
  • @RaySteam:因为colors[0, 0, visible[0, 0]]是[0, 0, 0]
  • @JohnZwinck 抱歉,Zwick 是一个不常见的德国名字(甚至有一家测量仪器公司就是这个名字)(我是德国人)。

标签: python numpy


【解决方案1】:

你可以用这个:

x = np.array([[0,1],[0,1]])
y = np.array([[0,0],[1,1]])
colors[(visible, y, x)]

它给出:

array([[[0, 0, 0],
        [1, 1, 0]],

       [[0, 1, 1],
        [0, 0, 1]]])

xy 选择您想要的像素,而visible 是您的z 平面选择器。它们实际上可以是一维的,它们将广播以填充另一个维度。您可以像这样构造任意大小的xy

x = np.arange(colors.shape[2])
y = np.arange(colors.shape[1]).reshape(-1,1) # transpose

【讨论】:

  • 如何得到 x 和 y? (我真正的问题当然来自比 2、2、2、3 和 2,2 大得多的数组)
  • @RuedigerJungbeck:我已经添加到我的答案中,展示了如何概括它。希望我的下标/尺寸正确,但我相信你会明白的。
  • 应该是x = np.arange(2).reshape(-1, 1)y = np.arange(2).reshape(1, -1)。另外,visible[x, y] 可能更正确
【解决方案2】:

您的问题非常有趣且具有挑战性。

Numpy's advanced indexing 的工作方式有点不同,就像您尝试直观地使用它一样。

有更多选择可以实现您想要的:

1.您可以在numpy.indices() 的帮助下使用如下高级索引:

import numpy as np

colors=np.array([
  [
  [[0, 0, 0], [1, 0, 0]],
  [[0, 1, 0], [0, 0, 1]]],

  [
  [[1, 0, 1], [1, 1, 0]],
  [[0, 1, 1], [1, 1, 1]]]])


visible = np.array(
  [[0, 1],
   [1, 0]])

x_ind, y_ind = np.indices(visible.shape)

view = colors[visible, x_ind, y_ind]

print(view)

输出:

[[[0 0 0]
  [1 1 0]]

 [[0 1 1]
  [0 0 1]]]

2. 或者,您可以使用numpy.choose(),在这种情况下这是非常直观的方式:

import numpy as np

colors=np.array([
  [
  [[0, 0, 0], [1, 0, 0]],
  [[0, 1, 0], [0, 0, 1]]],

  [
  [[1, 0, 1], [1, 1, 0]],
  [[0, 1, 1], [1, 1, 1]]]])

visible = np.array(
  [[0, 1],
   [1, 0]])

visible = visible.reshape(2,2,1)

view = np.choose(visible, colors)

print(view)

输出:

[[[0 0 0]
  [1 1 0]]

 [[0 1 1]
  [0 0 1]]]

【讨论】:

    猜你喜欢
    • 2020-05-20
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2020-03-29
    相关资源
    最近更新 更多