迭代通过numpy数组返回列为2​​d数组的最佳方法

时间:2014-04-26 17:44:52

标签: python numpy matrix

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

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

非常感谢您的建议!


我正在寻找一种迭代矩阵列的好方法,并将它们作为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]])

3 个答案:

答案 0 :(得分: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]

答案 1 :(得分:0)

一种方法是使用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]])

答案 2 :(得分:0)

您可以使用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]])