【发布时间】: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)