首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >NumPy hstack的奇怪行为

NumPy hstack的奇怪行为
EN

Stack Overflow用户
提问于 2019-05-16 08:32:42
回答 3查看 126关注 0票数 0

这里提供了一些背景知识。Numpy v1.16,Python 3.6.8。

然后我运行以下代码:

代码语言:javascript
复制
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应该是完全相同的矩阵,但在我的机器中却不是,那么我错过了什么呢?提前谢谢你

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-16 08:43:12

转置一维数组(如arr3arr4 )将返回一维数组,而不是二维数组。

代码语言:javascript
复制
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

代码语言:javascript
复制
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]])
票数 4
EN

Stack Overflow用户

发布于 2019-05-16 08:45:12

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

解决方法:使用numpy广播获取(n,1)

代码语言:javascript
复制
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]])
票数 1
EN

Stack Overflow用户

发布于 2019-05-16 09:19:33

代码语言:javascript
复制
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,)

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

代码语言:javascript
复制
In [95]: arr1.T.shape                                                           
Out[95]: (10,)

vstack (垂直)确保输入至少为2d,并在第一个轴上连接它们

代码语言:javascript
复制
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)

它有效地做到了:

代码语言:javascript
复制
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确保输入至少有一个维度,并在最后一个维度上进行连接。[source]

代码语言:javascript
复制
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,)

同样,转置不会改变一维形状。

另一个便利函数:

代码语言:javascript
复制
In [102]: np.column_stack((arr1,arr2)).shape                                    
Out[102]: (10, 2)

这使得输入为2d,并在最后一个轴上连接(请查看其代码以了解详细信息)

还有另一个便利:

代码语言:javascript
复制
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

结构化数组

代码语言:javascript
复制
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')])
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56159294

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档