Python数组/矩阵维度

时间:2015-04-21 17:38:01

标签: python numpy matrix

我创建了两个矩阵

import numpy as np
arrA = np.zeros((9000,3))
arrB = np.zerros((9000,6))

我想连接这些矩阵的各个部分。 但是当我尝试做的时候:

arrC = np.hstack((arrA, arrB[:,1]))

我收到错误:

ValueError: all the input arrays must have same number of dimensions

我想这是因为np.shape(arrB[:,1])等于(9000,)而不是(9000,1),但我无法弄清楚如何解决它。

你能否对这个问题发表评论?

4 个答案:

答案 0 :(得分:3)

您可以通过传递索引列表来保留维度,而不是索引:

>>> arrB[:,1].shape
(9000,)
>>> arrB[:,[1]].shape
(9000, 1)
>>> out = np.hstack([arrA, arrB[:,[1]]])
>>> out.shape
(9000, 4)

答案 1 :(得分:2)

我会尝试这样的事情:

np.vstack((arrA.transpose(), arrB[:,1])).transpose()

答案 2 :(得分:2)

有多种方法可以从arrB (9000,1)数组中进行选择:

np.hstack((arrA,arrB[:,[1]]))
np.hstack((arrA,arrB[:,1][:,None]))
np.hstack((arrA,arrB[:,1].reshape(9000,1)))
np.hstack((arrA,arrB[:,1].reshape(-1,1)))

一个使用索引与数组或列表的概念,下一个添加新轴(例如np.newaxis),第三个使用reshape。这些都是基本的numpy数组操作任务。

答案 3 :(得分:2)

这在视觉上更容易看到。

假设:

>>> arrA=np.arange(9000*3).reshape(9000,3)
>>> arrA
array([[    0,     1,     2],
       [    3,     4,     5],
       [    6,     7,     8],
       ..., 
       [26991, 26992, 26993],
       [26994, 26995, 26996],
       [26997, 26998, 26999]])
>>> arrB=np.arange(9000*6).reshape(9000,6)
>>> arrB
array([[    0,     1,     2,     3,     4,     5],
       [    6,     7,     8,     9,    10,    11],
       [   12,    13,    14,    15,    16,    17],
       ..., 
       [53982, 53983, 53984, 53985, 53986, 53987],
       [53988, 53989, 53990, 53991, 53992, 53993],
       [53994, 53995, 53996, 53997, 53998, 53999]])

如果你拿一片arrB,你就会产生一个看起来更像一行的系列:

>>> arrB[:,1]
array([    1,     7,    13, ..., 53983, 53989, 53995])

您需要的是与要添加到arrA的列形状相同的列:

>>> arrB[:,[1]]
array([[    1],
       [    7],
       [   13],
       ..., 
       [53983],
       [53989],
       [53995]])

然后hstack按预期工作:

>>> arrC=np.hstack((arrA, arrB[:,[1]]))
>>> arrC
array([[    0,     1,     2,     1],
       [    3,     4,     5,     7],
       [    6,     7,     8,    13],
       ..., 
       [26991, 26992, 26993, 53983],
       [26994, 26995, 26996, 53989],
       [26997, 26998, 26999, 53995]])

另一种形式是在一个维度中指定-1,并在.reshape()中指定所需的行数或列数:

>>> arrB[:,1].reshape(-1,1)  # one col
array([[    1],
       [    7],
       [   13],
       ..., 
       [53983],
       [53989],
       [53995]])
>>> arrB[:,1].reshape(-1,6)   # 6 cols
array([[    1,     7,    13,    19,    25,    31],
       [   37,    43,    49,    55,    61,    67],
       [   73,    79,    85,    91,    97,   103],
       ..., 
       [53893, 53899, 53905, 53911, 53917, 53923],
       [53929, 53935, 53941, 53947, 53953, 53959],
       [53965, 53971, 53977, 53983, 53989, 53995]])
>>> arrB[:,1].reshape(2,-1)  # 2 rows
array([[    1,     7,    13, ..., 26983, 26989, 26995],
       [27001, 27007, 27013, ..., 53983, 53989, 53995]])

阵列整形和堆叠here

还有更多内容