我是numpy的新手,在数组形状方面遇到了一些麻烦。
我想在Matlab中像矩阵一样操作数组。但是,我对以下事情感到困惑:
>>> b = np.array([[1,2],[3,4]])
array([[1, 2],
[3, 4]])
>>> c = b[:,1] # I want c is a column vector
>>> c.shape
(2,)
>>> d = b[1,:] # I want d is a row vector
>>> d.shape
>>> (2,)
我想将c
和d
分别视为列向量和行向量。
我不明白为什么c
和d
具有相同的形状(2,)
。
因此在以后的计算中给我带来麻烦。
谁能帮我解决这个问题。非常感谢!
答案 0 :(得分:0)
通常,如果您希望数组c
是形状为(2,1)
的列向量,则可以通过以下方式对其进行整形:
c = c.reshape(-1,1) # c.shape --> (2, 1)
类似地,如果您希望数组d
是形状为(1,2)
的行向量,则可以通过以下方式对其进行整形:
d = d.reshape(1,-1) # d.shape --> (1, 2)
答案 1 :(得分:0)
您可以使用
c = b[:,[1]]
d = b[[1],:]
将向量作为显式行/列向量:
c.shape # (1, 2)
d.shape # (2, 1)
答案 2 :(得分:0)
使用纯整数作为索引将返回该列/行作为真实向量。这类似于为列表建立索引-您只会在该索引处收到元素。包含尺寸被剥去:
>>> my_list = ['a', 'b', 'c', 'd']
>>> my_list[2]
'c'
相反,您需要切片。列表的切片是(子)列表,矩阵的切片是矩阵。使用numpy时,可以使用:
或切片索引将其指定为切片符号:
>>> c = b[:,:1] # slice notation
>>> c.shape
(2, 1)
>>> d = b[[1],:] # sequence of indices
>>> d.shape
(1, 2)
切片符号用于连续的索引范围。例如,:1
的意思是“从开始到1的所有内容”。序列符号适用于非连续索引集。例如,[0, 2]
会跳过索引1。如果只需要一个索引,则除非要处理边框(第一行/最后一行/列),否则序列符号会更简单。