numpy Python数组/矩阵维数

jm81lzqq  于 2023-01-17  发布在  Python
关注(0)|答案(4)|浏览(151)

我创建了两个矩阵

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),但我不知道如何解决它。
请你对这个问题发表评论。

xwbd5t1u

xwbd5t1u1#

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

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

igetnqfo2#

这在视觉上更容易看到。
假设:

>>> 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]])

另一种形式是在一个维度中指定行或列的数量,在.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]])

这里有更多关于数组整形和堆栈的内容

uurity8g

uurity8g3#

我会尝试这样的方法:

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

suzh9iv84#

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数组操作任务。

相关问题