问题描述
使用np.ravel(用于1D视图)或np.ndarray.flatten(用于1D副本)或np.ndarray.flat(用于1D迭代器):
In [12]: a = np.array([[1,2,3], [4,5,6]])
In [13]: b = a.ravel()
In [14]: b
Out[14]: array([1, 2, 3, 4, 5, 6])
请注意,ravel()
返回view
的a
时候可能。因此,修改b
也会修改a
。当1D元素在内存中连续时ravel()
返回aview
,但是copy
例如如果返回是a
通过使用非单位步长(例如a = x[::2]
)对另一个数组进行切片而得到的,则返回a 。
如果要复制而不是视图,请使用
In [15]: c = a.flatten()
如果只需要迭代器,请使用np.ndarray.flat
:
In [20]: d = a.flat
In [21]: d
Out[21]: <numpy.flatiter object at 0x8ec2068>
In [22]: list(d)
Out[22]: [1, 2, 3, 4, 5, 6]
解决方法
说我有一个数组a
:
a = np.array([[1,2,3],[4,5,6]])
array([[1,6]])
我想将其转换为一维数组(即列向量):
b = np.reshape(a,(1,np.product(a.shape)))
但这又回来了
array([[1,3,4,6]])
这与以下内容不同:
array([1,6])
我可以使用此数组的第一个元素将其手动转换为一维数组:
b = np.reshape(a,np.product(a.shape)))[0]
但这需要我知道原始数组有多少个维数(并在使用较大维数时将[0]连接起来)
有没有一种与尺寸无关的方式来从任意ndarray获取列/行向量?