【问题标题】:How to subtract the first column from every column of an array如何从数组的每一列中减去第一列
【发布时间】:2022-01-24 19:33:29
【问题描述】:

我正在做非常简单的减法,但我做错了。我想从数组的每一列中减去第一列。例如:

winner=
[1,2,3]
[2,3,5]
[3,5,7]

我想得到这样的结果:

[0,1,2]
[0,1,3]
[0,2,4]

这是错误,我不知道该怎么做。

winner.shape
(5, 3)

winner_difference=winner-winner[:,0]
winner_difference

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-69-d385252ef2de> in <module>
----> 1 winner_difference=winner-winner[:,0].T
      2 winner_difference

ValueError: operands could not be broadcast together with shapes (5,3) (5,) 

【问题讨论】:

标签: python numpy


【解决方案1】:

一种更有效的方法,利用 numpy 广播:

output = winner - winner[:, 0, None]

输出:

>>> output
array([[0, 1, 2],
       [0, 1, 3],
       [0, 2, 4]])

【讨论】:

  • 是的,理查德,它有效。我试图实现类似的广播,所以我使用了winner[:, [0]] 而不是winner[:, 0]。为什么?谢谢
  • 因为,[:, 0] 几乎就像您从网格中选择单个列,而 [:, [0]] 就像您选择的网格副本只有该列...一个是列本身,另一个是带有列的网格...
  • [:, 0]返回[1, 2 3],不能用于广播,[:, [0]]返回[[1], [2], [3]]可以广播。
  • 谢谢理查德!我很感激,圣诞快乐!
  • 哇哦,甜甜的!!我不会忘记那个绝妙的技巧@user3483203。谢谢你:)
【解决方案2】:

我相信您正在寻找:

winner - np.vstack(winner[0])

【讨论】:

  • 不过,通常情况下,您可以使用更高级的索引,例如我的回答:winner[:, [0]] ("select from columns the 0th element")
【解决方案3】:

用列表推导来实现这是一件非常简单的事情。

>>> winner = [[1,2,3], [2,3,5], [3,5,7]]
>>> [[y - x[0] for y in x] for x in winner]
[[0, 1, 2], [0, 1, 3], [0, 2, 4]]
>>> 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多