【问题标题】:Changing specified values on numpy array in a certain dimension在某个维度上更改 numpy 数组上的指定值
【发布时间】:2018-01-13 13:50:50
【问题描述】:

想知道是否有一种简单的方法可以做到这一点:

假设我有一个形状为 (2,3,2) 的 numpy 数组,例如:

x = 
[[[ 0, 1],
  [ 2, 3],
  [ 4, 5]],

 [[ 6, 7],
  [ 8, 9],
  [10,11]]]

如果我想用零替换与axis=1position=0 对应的所有条目,我可以轻松地做到这一点:

x[:,0,:] = 0
x = 
[[[ 0  0]
  [ 2  3]
  [ 4  5]]

 [[ 0  0]
  [ 8  9]
  [10 11]]]

但是,如果我有一个想要执行这些操作的轴列表,该怎么办。是否有内置的 numpy 函数?理想情况下,它看起来像这样:

array_replace(array=x,axis=1,pos=0,replace_val=0)

这将给出与上面相同的数组。

我可以想办法做到这一点,通过展平矩阵并根据每个数组的维度计算每个变量的位置,但我想知道 numpy 中是否已经内置了一些东西。

【问题讨论】:

  • 我不确定你想要什么,但这不是最好的方法,我可以保证。 Numpy 足够强大,可以轻松地对此类操作进行矢量化。

标签: python arrays numpy


【解决方案1】:

您可以构造一个切片元组,然后使用特定的轴作为位置。所以你可以定义这样的函数:

def array_replace(array, axis, pos, replace_val):
    array[(slice(None),) * axis + (pos,)] = replace_val

所以我们要做的是构造一个带有slice 对象(slice(None),) 的一元组。切片对象是 Python 在幕后为冒号: 生成的对象。所以x[:,0,:]x[(slice(None),0,slice(None))] 的简单表示。

接下来我们重复这个切片axis次(指定轴之前的次数),然后是我们想要的位置。剩余的切片是可选的,所以我们在这里不指定这些。然后我们使用 numpy 的广播将replace_val 分配给所有这些索引。

然后生成:

>>> x
array([[[ 0,  1],
        [ 2,  3],
        [ 4,  5]],

       [[ 6,  7],
        [ 8,  9],
        [10, 11]]])
>>> array_replace(array=x, axis=1, pos=0, replace_val=0)
>>> x
array([[[ 0,  0],
        [ 2,  3],
        [ 4,  5]],

       [[ 0,  0],
        [ 8,  9],
        [10, 11]]])

【讨论】:

  • 谢谢!你知道slice 函数在“幕后”做什么的参考吗?我以前没有遇到过这种用法,但它似乎非常有用。
  • @lstbl: slice 是构造函数。它构造了一个slice 对象。它没有多大作用,它只是作为: 的表示存在。具有__getitem__ 函数的对象可以处理切片。它有一个startstepstop 属性。
猜你喜欢
  • 2022-08-05
  • 2014-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-08
  • 2023-03-30
  • 2019-09-24
  • 2021-04-21
相关资源
最近更新 更多