【问题标题】:How to replace all elements of Python NumPy Array that are greater than a several values?如何替换大于多个值的 Python NumPy 数组的所有元素?
【发布时间】:2017-10-23 12:07:15
【问题描述】:

我知道我可以替换 Python NumPy 数组中大于某个值的所有元素:

np.putmask(A, A>0.5, 5)

其中A>0.5 是阈值,5 是新的替换值。但是,我怎样才能在更多条件下做到这一点?例如:

if x.all <0:
    return 00.1
elif x.all >0:
    return 1

其中 x 是一个数组。我试图:

np.putmask(x, x<0, 00.1)

np.putmask(x, x>0, 1)

但是,我想在一行中完成。知道如何使用 putmask 或任何其他方法在一行中进行此类替换吗?

【问题讨论】:

  • 自己写。
  • 为什么要这样任意限制?可以做到,但是太傻了。
  • 逐步函数 - 也许你在追求这样的东西:(x &gt; 0) * 0.9 + 0.1(大概,x 是一个 numpy 数组)
  • 如果你想实现一个逐步的功能,你可以做f(x) if x &gt; 0 else g(x)。这可能是XY problem。你能准确描述你想做什么吗?向我们展示您迄今为止所做的相关代码可能会有所帮助。
  • 您的标题询问有关设置某些值的问题。您的问题的一部分也涉及到这一点。但是随后您问如何在一行中进行多次重新分配。所以我问你为什么必须在一行中完成,你说你正在尝试实现一个逐步函数。然后,代码中的条件块必须从函数返回值,而不是分配值。我在这里看到了 3 个不同的问题,您想要做的一件事是什么?

标签: python arrays numpy math


【解决方案1】:

你在寻找双 np.where 即

A = np.array([0,1,2,3,1,-5,-6,-7])

k = np.where(A>0,1,np.where(A<0,0.01,A))

或者您可以将np.select 用于多个条件。

k = np.select([A>0,A<0],[1,.01],A)

输出:

[ 0.    1.    1.    1.    1.    0.01  0.01  0.01]

【讨论】:

  • 感谢您的帮助
【解决方案2】:

您可以为每个条件创建掩码(逻辑数组),然后应用所有掩码。

# Create masks
mask1 = (x < 0)
mask2 = (x > 0)
# Apply masks
x[mask1] = 0.1
x[mask2] = 1

如果你真的需要它在一行中:

mask1 = (x < 0); mask2 = (x > 0); x[mask1] = 0.1; x[mask2] = 1

您也可以在示例代码中使用putmask 函数:

mask1 = (x < 0); mask2 = (x > 0); np.putmask(x, mask1, 00.1); np.putmask(x, mask2, 1)

【讨论】:

  • 为什么这个解决方案不适合你?如果您希望它“在一行中”,只需将所有 4 个表达式用;s 分隔即可。
  • np.putmask(x, x&lt;0, 00.1; x, x&gt;0, 1) 喜欢这样吗?
  • 不,像这样:mask1 = (x &lt; 0); mask2 = (x &gt; 0); x[mask1] = 0.1; x[mask2] = 1
  • 或者如果你愿意,像这样:mask1 = (x &lt; 0); mask2 = (x &gt; 0); np.putmask(x, mask1, 00.1); np.putmask(x, mask2, 1)。您只需要在应用它们之前创建两个蒙版。
猜你喜欢
  • 2013-11-09
  • 1970-01-01
  • 2019-12-08
  • 2016-05-03
  • 1970-01-01
  • 2019-03-30
  • 2020-06-07
  • 2018-08-14
相关资源
最近更新 更多