首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >元素匹配条件时替换numpy子数组

元素匹配条件时替换numpy子数组
EN

Stack Overflow用户
提问于 2019-11-21 15:25:35
回答 3查看 190关注 0票数 2

我有一个n x m x 3 numpy数组。这代表了向复杂功能绘图仪的RGB表示的中间一步.当绘制的函数具有无穷大的值或具有奇异性时,RGB数据的一部分就变成了NaNs。

我正在寻找一种有效的方法,将包含NaN的行替换为我选择的行,比如[0, 0, 0][1, 1, 1]。在RGB值方面,这会将行为不佳的像素替换为白色或黑色像素。我所说的高效,是指利用numpy的矢量化和速度的某种方式。

请注意,我并不只是希望将NaN值替换为0(我知道如何使用numpy.where);如果一行包含NaN,则需要替换整行。我怀疑在numpy中可以很好地做到这一点,但我不确定如何做到。

具体问题

假设给我们一个2 x 2 x 3数组arr。如果一行包含5,我希望用[0, 0, 0]替换该行。缓慢执行此操作的代码如下所示。

代码语言:javascript
复制
import numpy as np

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

# so arr is
# array([[[1, 2, 3],
#       [4, 5, 6]],
#
#       [[1, 3, 5],
#        [2, 4, 6]]])

# Trivial and slow version to replace rows containing 5 with [0,0,0]
for i in range(len(arr)):
    for j in range(len(arr[i])):
        if 5 in arr[i][j]:
            arr[i][j] = np.array([0, 0, 0])

# Now arr is
#
# array([[[1, 2, 3],
#        [0, 0, 0]],
#
#       [[0, 0, 0],
#        [2, 4, 6]]])

我们如何利用numpy的优势来实现这一点呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-11-21 15:29:56

更简单的方法是-

代码语言:javascript
复制
arr[np.isin(arr,5).any(-1)] = 0

如果它只是你想要的一个值,那么我们可以简化为-

代码语言:javascript
复制
arr[(arr==5).any(-1)] = 0

如果您希望与NaN相匹配,则需要进行不同的比较,并使用np.isnan -

代码语言:javascript
复制
arr[np.isnan(arr).any(-1)] = 0

如果您希望分配数组值,而不仅仅是0,则解决方案将保持不变。因此-

代码语言:javascript
复制
arr[(arr==5).any(-1)] = new_array
票数 2
EN

Stack Overflow用户

发布于 2019-11-21 15:30:37

使用np.broadcast_to

代码语言:javascript
复制
arr[np.broadcast_to((arr == 5).any(-1)[..., None], arr.shape)] = 0

代码语言:javascript
复制
array([[[1, 2, 3],
        [0, 0, 0]],

       [[0, 0, 0],
        [2, 4, 6]]])

正如FYI一样,根据您的描述,如果您想要找到np.nans而不是像5这样的整数,则不应该使用==,而应该使用np.isnan

代码语言:javascript
复制
arr[np.broadcast_to((np.isnan(arr)).any(-1)[..., None], arr.shape)] = 0
票数 2
EN

Stack Overflow用户

发布于 2019-11-21 15:31:00

您可以使用in1d函数来完成它,如下所示

代码语言:javascript
复制
arr = np.array([[[1, 2, 3], [4, 5, 6]], [[1, 3, 5], [2, 4, 6]]])

arr[np.in1d(arr,5).reshape(arr.shape).any(axis=2)] = [0,0,0]
arr
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58978312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档