【问题标题】:Is there built in function in numpy to iterate advanced in 3d arraynumpy 中是否有内置函数可以在 3d 数组中进行高级迭代
【发布时间】:2021-09-20 16:46:20
【问题描述】:

我想创建一个以数组作为第一个参数的函数,该函数采用任意大小和形状的 arr 数组,并将其在给定 [a,b] 区间内的所有值覆盖为等于 c。 a、b、c 数字作为参数提供给函数。如下面的输入和输出

arr = np.array([[[5., 2., -5.], [4., 3., 1.]]])
overwrite_interval(arr, -2., 2., 100.) -> ndarray([[[5., 100., -5.], [4., 3., 100.]]])

def overwrite_interval(arr , a , b , c):  
  for i in arr[:,:]: 
  arr[a,b] = c

arr = np.array([[[5., 2., -5.], [4., 3., 1.]]])
assert overwrite_interval(arr, -2., 2., 100.) #-> ndarray([[[5., 100., -5.], [4., 3., 100.]]])

【问题讨论】:

  • 花更多时间阅读numpy 初学者的介绍。并尝试考虑整个数组操作,而不是逐个元素的迭代。这里的基本问题是,哪些元素属于替换范围?并确定了它们,如何替换它们。
  • 非常感谢,我尽量涵盖所有的decoumntion

标签: python arrays numpy


【解决方案1】:

我认为您提出问题的方式与您给出的示例不符。首先,您给出的示例数组是 3D,而不是 2D。你可以这样做

>>> arr.shape
(1,2,3)
>>> arr.ndim
3

大概这是一个错误,你希望你的数组是二维的,所以你会这样做

arr = np.array([[5., 2., -5.], [4., 3., 1.]])

改为。

其次,如果ab 是值,如果一个元素介于两者之间,那么将该元素设置为值c 而不是ab 作为索引,那么np.where 函数非常适合这个。

def overwrite_interval(arr , a , b , c):
    inds = np.where((arr >= a) * (arr <= b))
    arr[inds] = c
    return arr

np.where 返回一个元组,因此有时直接使用布尔数组会更容易。在这种情况下,函数看起来像这样

def overwrite_interval(arr , a , b , c):
    inds = (arr >= a) * (arr <= b)
    arr[inds] = c
    return arr

这对你有用吗?这是你的意图吗?请注意,如果您仍然希望初始数组是 3D 数组,我提供的解决方案将按原样工作。

【讨论】:

  • 感谢@Steven Thomas 成功了
猜你喜欢
  • 2021-03-26
  • 2014-07-09
  • 2021-03-07
  • 2021-12-31
  • 2016-01-10
  • 2020-11-13
  • 1970-01-01
  • 2018-09-26
  • 2021-11-16
相关资源
最近更新 更多