【问题标题】:Transform array into a binary array将数组转换为二进制数组
【发布时间】:2019-05-30 21:47:16
【问题描述】:

我目前有一个包含以下数据的 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.])

我认识到第一步显然是转换为浮点数,但我不知道下一步从哪里开始。有没有可以很好用的地图功能?一个拉姆达?一个for循环?我觉得如果我已经以不同的数组格式拥有它会很简单,但我不知道如何有条件地添加一个维度,然后用与已经存在的完全相反的二进制填充它。所有这些都基于 if-then 条件吗?抱歉,我只是对 Python 比较陌生,所以我还不知道所有的工具。

【问题讨论】:

  • 看起来你想reshape 使用 fortran 样式排序。试试a.reshape(-1, 2, order='F')

标签: arrays loops numpy


【解决方案1】:

您可以在适当的模板中使用高级索引:

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

【讨论】:

  • 出色地使用了 np.eye()。我将不得不解开其余的解决方案,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-08
  • 2013-11-05
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 2016-07-08
  • 2017-01-31
相关资源
最近更新 更多