我的问题是:我正在try 根据两个坐标的值过滤图像.我可以使用for循环轻松地完成此操作:

import numpy as np
import matplotlib.pyplot as plt

x = np.linspace(-1, 1, 101)
y = np.linspace(-1, 1, 51)

X, Y = np.meshgrid(x, y)

Z = np.exp(X**2 + Y**2)

newZ = np.zeros(Z.shape)

for i, y_i in enumerate(y):
    for j, x_j in enumerate(x):
        if x_j > 0 and y_i > 0:
            newZ[i, j] = Z[i, j]
        else:
            newZ[i, j] = 0

plt.contourf(x, y, newZ)
plt.show()

但我非常肯定应该有一种方法通过索引来做到这一点(因为它应该更快),比如:

Z = Z[y>0, x>0]

这不起作用(IndexError: Shape mismatch)

我假设我可以使用掩码数组使用掩码来做到这一点(似乎他们正在做类似于here的事情),但我想知道在Normal Numpy中是否有一个我似乎无法理解的简单一行程序. 谢谢

推荐答案

Edit,你必须使用numpy broadcasting:

m = (y[:, None] > 0) | (x > 0)
newZ = np.where(m, Z, 0)

# OR
m = (y[:, None] > 0) | (x > 0)
newZ = np.zeros(Z.shape)
newZ[m] = Z[m]

演示:

x = np.linspace(-1, 1, 11)
y = np.linspace(-1, 1, 6)

Z = np.arange(len(y)*len(x)).reshape(len(y), len(x))

m = (y[:, None] > 0) | (x > 0)
newZ = np.zeros(Z.shape, dtype=int)
newZ[m] = Z[m]

输出:

>>> x
array([-1. , -0.8, -0.6, -0.4, -0.2,  0. ,  0.2,  0.4,  0.6,  0.8,  1. ])

>>> y
array([-1. , -0.6, -0.2,  0.2,  0.6,  1. ])

>>> Z
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21],
       [22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32],
       [33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43],
       [44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
       [55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]])

>>> newZ
array([[ 0,  0,  0,  0,  0,  0,  6,  7,  8,  9, 10],
       [ 0,  0,  0,  0,  0,  0, 17, 18, 19, 20, 21],
       [ 0,  0,  0,  0,  0,  0, 28, 29, 30, 31, 32],
       [33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43],
       [44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
       [55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]])

masked array:

>>> np.ma.masked_array(Z, ~m, fill_value=0)
masked_array(
  data=[[--, --, --, --, --, --, 6, 7, 8, 9, 10],
        [--, --, --, --, --, --, 17, 18, 19, 20, 21],
        [--, --, --, --, --, --, 28, 29, 30, 31, 32],
        [33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43],
        [44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54],
        [55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65]],
  mask=[[ True,  True,  True,  True,  True,  True, False, False, False,
         False, False],
        [ True,  True,  True,  True,  True,  True, False, False, False,
         False, False],
        [ True,  True,  True,  True,  True,  True, False, False, False,
         False, False],
        [False, False, False, False, False, False, False, False, False,
         False, False],
        [False, False, False, False, False, False, False, False, False,
         False, False],
        [False, False, False, False, False, False, False, False, False,
         False, False]],
  fill_value=0)

IIUC,您要找的是np.where:

newZ = np.where(Z>0, Z, 0)

相同于:

m = Z>0
newZ = np.zeros(Z.shape)
newZ[m] = Z[m]

np.clip的替代方案:

newZ = np.clip(Z, 0, np.inf)

Python相关问答推荐

如何修复fpdf中的线路出血

如何将不同长度的新列添加到现有的框架中

使用Python进行网页抓取,没有页面

为什么基于条件的过滤会导致pandas中的空数据框架?

从今天起的future 12个月内使用Python迭代

在上下文管理器中更改异常类型

Python中是否有方法从公共域检索搜索结果

通过仅导入pandas来在for循环中进行多情节

将特定列信息移动到当前行下的新行

如何使用Python将工作表从一个Excel工作簿复制粘贴到另一个工作簿?

管道冻结和管道卸载

如何获得每个组的时间戳差异?

SQLAlchemy Like ALL ORM analog

把一个pandas文件夹从juyter笔记本放到堆栈溢出问题中的最快方法?

Python列表不会在条件while循环中正确随机化'

Plotly Dash Creating Interactive Graph下拉列表

如何排除prefecture_related中查询集为空的实例?

Flask运行时无法在Python中打印到控制台

从源代码显示不同的输出(机器学习)(Python)

查看pandas字符列是否在字符串列中