在此提供一些背景知识。 Numpy v1.16,Python 3.6.8。
然后运行以下代码:
import numpy as np
arr1 = np.repeat(True,20)
arr2 = np.repeat(np.arange(5),4)
X = np.vstack((arr1,
arr2
)).T
arr3 = np.repeat(True,20).T
arr4 = np.repeat(np.arange(5),4).T
Y = np.hstack((arr3,
arr4
))
结果是X.shape为(20,2)(正常),而Y.shape为(40,)异常。
在数学上,X和Y应该是完全相同的矩阵,但在我的机器中不是。那我在这里想念什么?预先谢谢
答案 0 :(得分:4)
转置一维数组(例如arr3
和arr4
会返回一维数组,而不是二维数组。
np.repeat(True,5)
# returns:
array([ True, True, True, True, True])
np.repeat(True,5).T
# returns:
array([ True, True, True, True, True])
它不会产生新轴。您需要在移调之前执行此操作。
要增加轴数,可以使用np.newaxis
。
a = np.repeat(True, 5)
a[:, np.newaxis]
# returns:
array([[ True],
[ True],
[ True],
[ True],
[ True]])
a[:, np.newaxis].T
# returns:
array([[ True, True, True, True, True]])
答案 1 :(得分:1)
您的问题是即使使用T,但您的arr是一个维度(n,)
,这意味着您不能简单地将T
变成(n,1)
维度
如何解决:通过广播numpy
获得(n,1)
Y = np.hstack((arr3[:,None],
arr4[:,None]
))
Y
Out[14]:
array([[1, 0],
[1, 0],
[1, 0],
[1, 0],
[1, 1],
[1, 1],
[1, 1],
[1, 1],
[1, 2],
[1, 2],
[1, 2],
[1, 2],
[1, 3],
[1, 3],
[1, 3],
[1, 3],
[1, 4],
[1, 4],
[1, 4],
[1, 4]])
答案 2 :(得分:1)
In [92]: arr1 = np.repeat(True,10)
...: arr2 = np.repeat(np.arange(5),2)
In [93]: arr1.shape
Out[93]: (10,)
In [94]: arr2.shape
Out[94]: (10,)
移调可切换轴,但不添加任何轴。
In [95]: arr1.T.shape
Out[95]: (10,)
vstack(垂直)确保输入至少为2d,并在第1轴上将它们合并
In [96]: np.vstack((arr1,arr2))
Out[96]:
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4]])
In [97]: _.shape
Out[97]: (2, 10)
它确实有效:
In [99]: np.concatenate((arr1.reshape(1,-1),arr2.reshape(1,-1)), axis=0)
Out[99]:
array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],
[0, 0, 1, 1, 2, 2, 3, 3, 4, 4]])
请注意,布尔值True
已更改为数字1
,因此其dtype与arr2
相同。
hstack
确保输入的尺寸至少为1维,并在最后一维连接。 [source]
In [100]: np.hstack((arr1,arr2))
Out[100]: array([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4])
In [101]: _.shape
Out[101]: (20,)
再次换位不会改变1d形状。
另一个便利功能:
In [102]: np.column_stack((arr1,arr2)).shape
Out[102]: (10, 2)
这将使输入成为2d,并在最后一个轴上接合(有关详细信息,请查看其代码)
另一个方便之处:
In [103]: np.stack((arr1,arr2),axis=1).shape
Out[103]: (10, 2)
In [104]: np.stack((arr1,arr2),axis=0).shape
Out[104]: (2, 10)
所有这些都只是调整尺寸,然后使用concatenate
。
In [110]: arr = np.zeros((10,), dtype='bool,i')
In [111]: arr['f0']=arr1
In [112]: arr['f1']=arr2
In [113]: arr
Out[113]:
array([( True, 0), ( True, 0), ( True, 1), ( True, 1), ( True, 2),
( True, 2), ( True, 3), ( True, 3), ( True, 4), ( True, 4)],
dtype=[('f0', '?'), ('f1', '<i4')])