Python NumPy hstack&x27;这是一种奇怪的行为

Python NumPy hstack&x27;这是一种奇怪的行为,python,arrays,numpy,multidimensional-array,concatenation,Python,Arrays,Numpy,Multidimensional Array,Concatenation,这里有一点背景。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

这里有一点背景。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形为(20,2)(正常),而Y形为(40),异常


在数学上,X和Y应该是完全相同的矩阵,但在我的机器中,它们不是。那么我在这里错过了什么?提前感谢

转置一维数组,如
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]])

你的问题甚至是T,但你的arr是一维的
(n,)
,这意味着你不能简单地
T
,使它变成
(n,1)

如何修复:使用
numpy
广播获取(n,1)

转置切换轴,但不添加任何轴

In [95]: arr1.T.shape                                                           
Out[95]: (10,)
vstack(垂直)确保输入至少为2d,并在第一个轴上连接它们

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
,因此它的数据类型与
arr2
相同

hstack
确保输入至少有一个维度,并在最后一个维度上连接

同样,转置不会改变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)
所有这些都只是调整尺寸,然后使用
连接

结构化阵列 [110]中的
:arr=np.zeros((10,),dtype='bool,i')
在[111]中:arr['f0']=arr1
在[112]中:arr['f1']=arr2
In[113]:arr
出[113]:
数组([(真,0),(真,0),(真,1),(真,1),(真,2),
(对,2),(对,3),(对,3),(对,4),(对,4)],
数据类型=[('f0','?'),('f1','
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,)
In [102]: np.column_stack((arr1,arr2)).shape                                    
Out[102]: (10, 2)
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)
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')])