将数组转换为二进制数组

时间:2019-05-30 21:47:17

标签: arrays loops numpy

我目前有一个包含以下数据的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,所以我还不了解所有工具。

1 个答案:

答案 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.]])