Python: 将阈值应用于 numpy 数组

Python: Applying threshold to a numpy array

给定 numpy.ndarray 的命令:

d={0: np.array([[  9.81650352,  10.03896523,  10.26972675],  [11.76386738,
          11.76718712,  11.63769531]]),
   1: np.array([[  13.33630352,  29.17866523,  17.1005102675],  [41.98976738,
          6.44368712,  2.11764771]])}

以及以下阈值:

t=10

如果 d 中的每个浮点值都是 >=t,我想要一个带有 1 的新字典,如果是 <t,我想要一个带有 0 的新字典。我的尝试

newd={k:[[1]] or [[0]] for k,[[v]] in d if [[v]]>=t}

returns:

Traceback (most recent call last):

  File "<ipython-input-152-68383ed9ad79>", line 1, in <module>
    newd={k:[[1]] or [[0]] for k,[[v]] in d if [[v]]>=17}

  File "<ipython-input-152-68383ed9ad79>", line 1, in <dictcomp>
    newd={k:[[1]] or [[0]] for k,[[v]] in d if [[v]]>=17}

TypeError: 'int' object is not iterable

我应该如何 "rephrase" 我的代码片段?

在这个例子中,预期的结果是:

newd={0: np.array([[ 0,  1,  1],  [1, 1,  1]]),
      1: np.array([[ 1,  1,  1],  [1, 0,  0]])}

您可以使用 np.where 作为 :

>>> new_d = {k:np.where(v >= 10, 1, 0) for k, v in d.iteritems()}
>>> {0: array([[0, 1, 1],[1, 1, 1]]), 1: array([[1, 1, 1], [1, 0, 0]])}

np.where方法将条件作为第一个参数和两个值xy。如果同时指定了 x 和 y,则输出数组包含条件为 True 的 x 的元素,以及来自 y 其他地方的元素

>>> from pprint import pprint
>>> pprint(d)
{0: array([[  9.81650352,  10.03896523,  10.26972675],
       [ 11.76386738,  11.76718712,  11.63769531]]),
 1: array([[ 13.33630352,  29.17866523,  17.10051027],
       [ 41.98976738,   6.44368712,   2.11764771]])}

创建布尔数组

>>> d2 = {k:v > t for k,v in d.items()}
>>> pprint(d2)
{0: array([[False,  True,  True],
       [ True,  True,  True]], dtype=bool),
 1: array([[ True,  True,  True],
       [ True, False, False]], dtype=bool)}

然后乘以1

>>> d3 = {k: v * 1 for k, v in d2.items()}
>>> pprint(d3)
{0: array([[0, 1, 1],
       [1, 1, 1]]),
 1: array([[1, 1, 1],
       [1, 0, 0]])}
>>> 

:

>>> d4 = {k : 1 * (v > t) for k,v in d.items()}
>>> pprint(d4)
{0: array([[0, 1, 1],
       [1, 1, 1]]),
 1: array([[1, 1, 1],
       [1, 0, 0]])}
>>> 

我开始使用这种方法是因为我不区分 True/False 和 1/0 - 它们等同于我。但也许使用 numpy.where 是更好的解决方案。