Python 遍历numpy数组并将列作为二维数组返回的最佳方法

Python 遍历numpy数组并将列作为二维数组返回的最佳方法,python,numpy,matrix,Python,Numpy,Matrix,编辑:感谢大家提供的好的解决方案,我想如果我必须选择一个,那就是A[:,[0]] 我现在收集了7种方法,并将它们放入一个。timeit基准并不令人惊讶:它们在速度方面大致相同 非常感谢你的建议 我正在寻找一种很好的方法来遍历矩阵的列,并将它们作为1xd列向量返回。我有一些想法,但我不认为这些是好的解决方案。我想我错过了一些东西。你推荐哪条路?例如,假设我有以下矩阵,并希望返回第一列作为列向量: A = np.array([ [1,2,3], [4,5,6], [7,8,9] ]) >&g

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

我现在收集了7种方法,并将它们放入一个。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,)
>>> A[:,0:1]
array([[1],
       [4],
       [7]])

>>> A[:,0].reshape(A.shape[1],1)
array([[1],
       [4],
       [7]])
我想要的是:

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]
array([1, 4, 7])
>>> A[:,0].shape
(3,)
>>> A[:,0:1]
array([[1],
       [4],
       [7]])

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

一种方法是使用
numpy.row\u堆栈
numpy.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]])
您可以使用:

只需确保为单个列提供了一个1元素元组,或者得到了不同的结果:

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

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

A[:,0:1] # not so clear
A[:,:1]  # black magic
A[:,[0]] # clearest syntax imho
关于
重塑
解决方案,您可以像这样增强语法:

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]

是否确实需要将提取内容作为列向量?如果是这样的话,我想你已经在你的问题中回答了你的问题:这样做的标准方法是添加一个新的轴。重要的是要理解,这不会改变内存中的表示形式。你似乎觉得不方便。为什么?您使用
0:1
的解决方法也可以,尽管这可能会误导您的代码读者,他们可能认为您实际上是在分割更大的块。必须问问您为什么需要它们作为“列”向量。如何使用结果?添加
newaxis
或重塑结果几乎没有成本。我认为可能有一种更简单的方法,例如,像myarray中的行:像myarray中的col.cols之类。不管怎样,为什么我需要它们作为列?我将它们馈送给具有声明的函数,如myvec.shape[1]==1在转置的“行”上进行删除:
for col in A.T:print col.reformate(-1,1)