Python:将阈值应用于numpy数组

时间:2017-02-20 17:28:43

标签: python dictionary dictionary-comprehension

鉴于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中的每个浮点值都是1,我想要一个包含>=t的新词典,如果0,则<tnewd={k:[[1]] or [[0]] for k,[[v]] in d if [[v]]>=t} 我的尝试

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

返回:

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

我应该如何“改写”我的代码?

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

F3

2 个答案:

答案 0 :(得分:5)

您可以将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,则输出数组包含x的元素,其中condition为True,而y中的元素为

答案 1 :(得分:1)

>>> 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)}

然后乘以一个

>>> 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是更好的解决方案。