我目前有一个包含以下数据的numpy数组:
array([0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 0,
1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 0,
0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0,
1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 1,
0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 1,
0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0])
我需要将其转换为如下所示的数组:
array([0., 1.],
[0., 1.],
[1., 0.],
[1., 0.],
[1., 0.],
[0., 1.],
[1., 0.],
[1., 0.],
[1., 0.],
[1., 0.],
...
[0., 1.])
我认识到第一步显然是转换为浮动,但是我不知道下一步要从哪里开始。有没有地图功能可以很好地工作?一个lambda?一个for循环?我感觉如果我已经以其他数组格式拥有它会很简单,但是我不知道如何有条件地添加一个维度,然后使用与已有元素正好相反的二进制数来填充它。所有这些都是基于if-then条件的吗?抱歉,我刚接触Python,所以我还不了解所有工具。
答案 0 :(得分:2)
您可以在高级模板中使用高级索引:
small_example = np.array([1,0,0,1,1,1,0,1])
(1-np.eye(2))[small_example]
# array([[1., 0.],
# [0., 1.],
# [0., 1.],
# [1., 0.],
# [1., 0.],
# [1., 0.],
# [0., 1.],
# [1., 0.]])
同样的想法也可以使用np.where
来实现:
np.where(small_example[:,None], *np.eye(2))
# array([[1., 0.],
# [0., 1.],
# [0., 1.],
# [1., 0.],
# [1., 0.],
# [1., 0.],
# [0., 1.],
# [1., 0.]])
一种更直接的方法,展示了如何创建列行向量,如何将它们一起广播以及如何投射dtype
:
(np.c_[small_example]^np.r_[:2]).astype(float)
# array([[1., 0.],
# [0., 1.],
# [0., 1.],
# [1., 0.],
# [1., 0.],
# [1., 0.],
# [0., 1.],
# [1., 0.]])
我们还可以在列中堆叠输入及其“负数”;我们使用1.0
来触发类型提升:
np.c_[small_example,1.0-small_example]
# array([[1., 0.],
# [0., 1.],
# [0., 1.],
# [1., 0.],
# [1., 0.],
# [1., 0.],
# [0., 1.],
# [1., 0.]])