【问题标题】:Python numpy.compress() to reduce a matrixPython numpy.compress() 减少矩阵
【发布时间】:2021-03-31 00:15:10
【问题描述】:

我想使用向量 unumpy.compress() 方法来减少 NumPy 矩阵,首先遍历行然后遍历列。现在我的代码如下所示:

n = 4 #number of rows/columns
square_matrix = np.array([[1,2,3,4],[5,6,7,8],[9,10,11,12],[13,14,15,16]])
u = np.array([1,0,1,0])

v = []

for i in range(n):
    v.append(np.compress(u,square_matrix[i]))

print(v)

我得到以下输出:

[array([1, 3]), array([5, 7]), array([ 9, 11]), array([13, 15])]

我有两个问题:

  1. 现在如何从输出中再次创建矩阵。
  2. 如何对列重复相同的过程。 (我最初的想法是使用u 的转置,如下所示:
for j in range((len(v_matrix[0])-1)):
    w.append(np.compress(u.transpose(),v_matrix[:][j]))

【问题讨论】:

  • u 是 1d,所以转置不会改变任何东西。看起来有点像您只阅读了 np.compress 文档的一部分,而忽略或不理解 axis 部分。

标签: python numpy matrix


【解决方案1】:

compress 像许多 numpy 缩减函数一样采用轴参数:

In [166]: np.compress(u,square_matrix, axis=1)
Out[166]: 
array([[ 1,  3],
       [ 5,  7],
       [ 9, 11],
       [13, 15]])
In [167]: np.compress(u,square_matrix, axis=0)
Out[167]: 
array([[ 1,  2,  3,  4],
       [ 9, 10, 11, 12]])

按顺序应用压缩:

In [168]: np.compress(u,np.compress(u,square_matrix, axis=0),axis=1)
Out[168]: 
array([[ 1,  3],
       [ 9, 11]])

我没有意识到np.compress 的存在,尽管从源文件中它必须从一开始就在那里。布尔索引是相同的,并且更常见。

In [169]: bu = u.astype(bool)
In [170]: square_matrix[bu,:]
Out[170]: 
array([[ 1,  2,  3,  4],
       [ 9, 10, 11, 12]])
In [171]: square_matrix[:,bu]
Out[171]: 
array([[ 1,  3],
       [ 5,  7],
       [ 9, 11],
       [13, 15]])

布尔索引等同于使用nonzero 结果进行索引:

In [177]: np.nonzero(u)
Out[177]: (array([0, 2]),)
In [178]: idx = np.nonzero(u)[0]
In [179]: square_matrix[idx,:]
Out[179]: 
array([[ 1,  2,  3,  4],
       [ 9, 10, 11, 12]])

这可以同时应用于两个维度:

In [180]: square_matrix[idx[:,None],idx]
Out[180]: 
array([[ 1,  3],
       [ 9, 11]])

没有重塑(使第一列),我们得到对角线:

In [181]: square_matrix[idx,idx]
Out[181]: array([ 1, 11])

并使用ix_ 实用程序:

In [185]: np.ix_(bu,bu)
Out[185]: 
(array([[0],
        [2]]),
 array([[0, 2]]))
In [186]: square_matrix[np.ix_(bu,bu)]
Out[186]: 
array([[ 1,  3],
       [ 9, 11]])

【讨论】:

    【解决方案2】:
    1. 我现在如何从输出中再次创建一个矩阵。

    你可以用矢量化的方式进行操作,只需为np.compress指定axis关键字

    np.compress(u, square_matrix, axis=1)
    

    输出:

    array([[ 1,  3],
           [ 5,  7],
           [ 9, 11],
           [13, 15]])
    
    1. 如何对列重复相同的过程。 (我最初的想法是使用 u 的转置)

    您的建议是正确的,但转置矩阵而不是 u。这将用行切换列。

    np.compress(u, square_matrix.T, axis=1)
    

    输出:

    array([[ 1,  9],
           [ 2, 10],
           [ 3, 11],
           [ 4, 12]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-10-04
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多