【问题标题】:Best way to iterate through a numpy array returning the columns as 2d arrays遍历将列作为二维数组返回的 numpy 数组的最佳方法
【发布时间】:2014-04-26 17:44:51
【问题描述】:

编辑:谢谢大家的好解决方案,我想如果我必须选择一个,那就是A[:,[0]]

我现在收集了 7 个方法并将它们放入 IPython notebook。 timeit 基准并不令人惊讶:它们在速度方面都大致相同。

非常感谢您的建议!


我正在寻找一种遍历矩阵列并将它们作为 1xd 列向量返回的好方法。我有一些想法,但我认为这些都不是好的解决方案。我想我在这里遗漏了一些东西。你会推荐哪种方式?例如,假设我有以下矩阵并希望将第一列作为列向量返回:

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

默认情况下,numpy 会这样返回:

>>> A[:,0]
array([1, 4, 7])
>>> A[:,0].shape
(3,)

而我想要的是这样的:

array([[1],
       [4],
       [7]])

.shape = (3,1)


转置无法将其作为列向量返回。

>>> A[:,0].T
array([1, 4, 7])

>>> A[:,0]
  array([1, 4, 7])

我每次都必须创建一个新轴

>>> A[:,0][:,np.newaxis].shape
(3, 1)
>>> A[:,0][:,np.newaxis]
array([[1],
       [4],
       [7]])

或者在做了一些实验之后,我想出了其他类似的解决方法:

>>> A[:,0:1]
array([[1],
       [4],
       [7]])

>>> A[:,0].reshape(A.shape[1],1)
array([[1],
       [4],
       [7]])

【问题讨论】:

  • 您确定需要将数据提取作为列向量吗?如果是这样,我认为您已经在您的问题中回答了您的问题:执行此操作的规范方法是添加一个新轴。重要的是要理解这不会改变内存中的表示。你似乎觉得不方便。为什么?您使用0:1 的解决方法也可以,尽管它可能会误导您的代码读者,他们可能认为您实际上是在切片更大的块。
  • 得问一下为什么需要它们作为“列”向量。您如何使用结果?
  • 添加newaxis 或重塑结果几乎不需要任何成本。
  • 我认为可能有更简单的方法,例如for row in myarray: 之类的for col in myarray.cols 左右。无论如何,为什么我需要它们作为列?我将它们提供给具有诸如 myvec.shape[1] == 1 之类的断言的函数
  • 遍历转置的“行”:for col in A.T: print col.reshape(-1,1)

标签: python numpy matrix


【解决方案1】:

我最喜欢的解决方案是切片。您有不同的解决方案:

A[:,0:1] # not so clear
A[:,:1]  # black magic
A[:,[0]] # clearest syntax imho

关于reshape 解决方案,您可以像这样增强语法:

A[:,0].reshape(A.shape[1],1)
A[:,0].reshape(-1,1)

您还可以合并以下内容:

A[:,0][:,np.newaxis] # ->
A[:,0,np.newaxis] # or
A[:,np.newaxis,0]

【讨论】:

    【解决方案2】:

    一种方法是使用numpy.row_stacknumpy.vstack

    In [91]: np.row_stack(A[:,0])
    Out[91]: 
    array([[1],
           [4],
           [7]])
    In [92]: np.vstack(A[:,0])
    Out[92]: 
    array([[1],
           [4],
           [7]])
    

    【讨论】:

      【解决方案3】:

      你可以使用column_stack:

      >>> A
      array([[1, 2, 3],
             [4, 5, 6],
             [7, 8, 9]])
      >>> np.column_stack((A[:,0],))
      array([[1],
             [4],
             [7]])
      >>> #                ^^^^^^^ a tuple
      

      只要确保你给它一个单列的 1 元素元组,否则你会得到不同的东西:

      >>> np.column_stack(A[:,0])
      array([[1, 4, 7]])
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-04-22
        • 1970-01-01
        • 2010-11-03
        • 2012-05-16
        • 1970-01-01
        • 2021-06-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多