Python:将阈值应用于numpy数组

FaC*_*fee 2 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]])}
Run Code Online (Sandbox Code Playgroud)

以下门槛:

t=10
Run Code Online (Sandbox Code Playgroud)

1如果d中的每个浮点值都是>=t,0那么我想要一个新的dict,如果是的话<t.我的尝试

newd={k:[[1]] or [[0]] for k,[[v]] in d if [[v]]>=t}
Run Code Online (Sandbox Code Playgroud)

收益:

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
Run Code Online (Sandbox Code Playgroud)

我应该如何"改写"我的片段?

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

newd={0: np.array([[ 0,  1,  1],  [1, 1,  1]]),
      1: np.array([[ 1,  1,  1],  [1, 0,  0]])}
Run Code Online (Sandbox Code Playgroud)

Zda*_*daR 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]])}
Run Code Online (Sandbox Code Playgroud)

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