鉴于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
,则<t
。newd={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
答案 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
方法将条件视为第一个参数和两个值x
和y
。如果同时指定了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是更好的解决方案。