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)