我已经看到其他人发帖了,但我不清楚是否有更好的解决方案。我有一个2D NumPy数组,我想在其中添加一列。例如:
import numpy as np
A = np.array([[2., 3.],[-1., -2.]])
e = np.ones(2)
print(A)
print(e)
B = np.hstack((A,e.reshape((2,1))))
print(B)
完全符合我的要求。但有没有办法避免这种笨拙的重塑使用?
答案 0 :(得分:2)
如果您想避免使用reshape
,则必须附加正确尺寸的列:
e = np.ones((2, 1))
B = np.hstack((A,e))
请注意对ones
的调用的修改。你现在必须使用重塑的原因是numpy并不认为维度2的数组与维度(2,1)的数组相同。第二个是2D数组,其中一个维度的大小为1
。
答案 1 :(得分:1)
我直接解决方案的提名是
np.concatenate((A, e[:, None]), axis=1)
[:,None]
将e
变成(2,1),可以连接到(2,2)以产生(2,3)。重塑也是如此,但在语法上并不漂亮。
使用hstack
,vstack
和c_
的解决方案做同样的事情,但隐藏了一个或多个细节。
在这种情况下,我认为column_stack
隐藏了最多的细节。
np.column_stack((A, e))
在幕后,这样做:
np.concatenate((A, np.array(e, copy=False, ndmin=2).T), axis=1)
np.array(... ndmin=2).T
是进行重塑的另一种方式。
答案 2 :(得分:1)
有很多解决方案。我喜欢np.c_
将1d输入视为列(因此c
),从而产生简洁,无杂乱,易于阅读的内容:
np.c_[A, e]
# array([[ 2., 3., 1.],
# [-1., -2., 1.]])
答案 3 :(得分:0)
正如Tim B所说,hstack
你需要一个(2,1)
数组。或者(将e
保持为一维数组),vstack
到转置,然后进行转置:
In [11]: np.vstack((A.T, e)).T
Out[11]:
array([[ 2., 3., 1.],
[-1., -2., 1.]])