【问题标题】:Choose indices in numpy arrays on particular dimensions [duplicate]在特定维度上选择numpy数组中的索引[重复]
【发布时间】:2018-08-24 14:11:07
【问题描述】:

很难找到一个清晰的标题,但一个例子会清楚地说明它。 例如,我的输入是:

c = np.full((4, 3, 2), 5)
c[:,:,1] *= 2

ix = np.random.randint(0, 2, (4, 3))

如果ix 是:

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

如果想要结果:

array([[10,  5, 10],
       [ 5,  5, 10],
       [ 5,  5, 10],
       [10, 10,  5]])

我的 c 数组可以是任意维度,也可以是我想要采样的维度。

这听起来像插值,但每次我想应用它时我都不愿意构造一个索引数组。有没有办法在 numpy 数组上使用某种索引来做到这一点?还是我必须使用一些插值方法... 速度和内存在这里是一个问题,因为我必须多次这样做,而且数组可能非常大。

感谢您的任何见解!

【问题讨论】:

  • 那么,c.shape[2] 总是2
  • 不,可以是任意数字...

标签: python arrays numpy indexing


【解决方案1】:

使用numpy.ogrid 创建x、y 索引,然后使用advanced indexing

idx, idy = np.ogrid[:c.shape[0], :c.shape[1]]
c[idx, idy, ix]

#array([[10,  5, 10],
#       [ 5,  5, 10],
#       [ 5,  5, 10],
#       [10, 10,  5]])

【讨论】:

  • 感谢您的回答!我想知道我是否可以避免创建网格......但我没有其他解决方案,我会接受你的!
  • ogrid 是一个“开放”网格,包含 (4,1) 和 (1,3) 数组。所以它们没有什么特别贵的。您只需要一对与您的ix 一起广播。 np.ix_(range(4), range(3)) 产生相同的一对。
猜你喜欢
  • 1970-01-01
  • 2021-06-15
  • 1970-01-01
  • 1970-01-01
  • 2020-07-26
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多