【问题标题】:How to subtract along axis=0 in python?如何在python中沿axis = 0减去?
【发布时间】:2020-06-15 09:57:23
【问题描述】:

我有一个矩阵mat,如下所示;

mat = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

还有一个列表s = [1, 2, 5]. 我必须沿axis = 1减去。我按照下面的方法做了,它可以工作..

mat - s = array([[ 0,  0, -2],
                [ 3,  3,  1],
                [ 6,  6,  4]])

但是,如果我沿轴 = 0 减去; 即,

mat - s[:,None]

我得到错误。

TypeError: list indices must be integers or slices, not tuple

【问题讨论】:

  • s=np.array([1,2,3])开头,一个数组,而不是一个列表。
  • 在 numpys c origin 它是一个数组,但在 python 中,术语列表更好更正确。

标签: python python-3.x list numpy


【解决方案1】:

这里有一个小技巧:

s = np.array([1,2,5])  
(mat.T - s).T 

输出:

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

编辑:如果s1d.T 不会更改任何内容,因此您可以将其删除。

【讨论】:

  • s.T 如果s 是 1d,则不执行任何操作
【解决方案2】:

您使用[:,None] 是正确的,但是您对s 的定义是错误的。

In [128]: mat = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])                                                     
In [129]: s = [1, 2, 5]                                                                                         
In [130]: mat  - s                                                                                              
Out[130]: 
array([[ 0,  0, -2],
       [ 3,  3,  1],
       [ 6,  6,  4]])

在此减法中,s 已自动“提升”为 numpy 数组。

[..,...] 索引不适用于列表

In [131]: s[:,None]                                                                                             
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-131-bafcfb7b67c1> in <module>
----> 1 s[:,None]

TypeError: list indices must be integers or slices, not tuple

此错误中的元组是逗号表达式:s[:, None]s[(:,None)] 相同。 python 解析器将一个元组传递给s.__getitem__ 方法。 numpy 数组处理元组(多维索引),列表不处理。

如果我们从一个数组开始,那么我们可以应用重塑,并执行所需的减法:

In [132]: sa = np.array(s)                                                                                      
In [133]: sa                                                                                                    
Out[133]: array([1, 2, 5])
In [134]: sa[:,None]                                                                                            
Out[134]: 
array([[1],
       [2],
       [5]])
In [135]: mat - sa[:,None]                                                                                      
Out[135]: 
array([[0, 1, 2],
       [2, 3, 4],
       [2, 3, 4]])

sa 是 1d,所以转置不会改变任何东西:

In [136]: sa.T                                                                                                  
Out[136]: array([1, 2, 5])

【讨论】:

    猜你喜欢
    • 2015-09-09
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 2011-07-12
    • 2022-01-10
    • 1970-01-01
    相关资源
    最近更新 更多