【问题标题】:How to reshape a 1-d array into a an array of shape (1,4,5)?如何将一维数组重塑为形状(1,4,5)的数组?
【发布时间】:2017-01-02 02:53:08
【问题描述】:

我有这些向量:

a = [1,2,3,4]
b = [1,2,3,5]

我希望最后能有这个:

A = [ [1,0,0,0,0]
      [0,1,0,0,0]
      [0,0,1,0,0]
      [0,0,0,1,0] ]

B = [ [1,0,0,0,0]
      [0,1,0,0,0]
      [0,0,1,0,0]
      [0,0,0,0,1] ]

我一直以这种方式从 python 中使用 np.reshape:

A = np.reshape(a,(1,4,1))
B = np.reshape(b,(1,4,1))

它只是完成了部分工作,因为我得到了以下结果:

A = [[1]
     [2]
     [3]
     [4]]

B = [[1]
     [2]
     [3]
     [5]]  

理想情况下,我想要这样的东西:

A = np.reshape(a,(1,4,(1,5)) 

但是在阅读文档时,这是不可能的。

提前感谢您的帮助

【问题讨论】:

  • 你需要考虑到列表a中的每一项都是一个范围从max(a,b)的分类值
  • 如果ab 中的值假设基于0 的索引会更“pythonic”,所以0 是第一列。您有机会对您的代码进行这样的更改吗? (这不是必需的,但它会很好。它消除了解决方案中的减法 1。)

标签: python numpy reshape encoder


【解决方案1】:

您尝试做的实际上并不是重塑,因为您改变了数据的结构。 用你想要的形状创建一个新数组:

A = np.zeros(myshape)
B = np.zeros(myshape)

然后索引这些数组

n = 0
for i_a, i_b in zip(a, b):
    A[n, i_a - 1] = 1
    B[n, i_b - 1] = 1
    n += 1 

赋值中的i_a/i_b - 1 仅用于使第 1 个索引成为第 0 个元素。这也仅在 ab 具有相同长度时才有效。如果它们的长度不同,请制作这两个循环。 可能有一个更优雅的解决方案,但这应该可以完成工作:)

【讨论】:

    【解决方案2】:

    或者,numpy 可以一次性为行/列上的多个索引赋值,例如:

    In [1]: import numpy as np
    
    In [2]: b = [1,2,3,5]
       ...: 
       ...: 
    
    In [3]: zero = np.zeros([4,5])
    
    In [4]: brow, bcol = range(len(b)), np.array(b) -1  # logical transform
    
    In [5]: zero[brow, bcol] = 1
    
    In [6]: zero
    Out[6]: 
    array([[ 1.,  0.,  0.,  0.,  0.],
           [ 0.,  1.,  0.,  0.,  0.],
           [ 0.,  0.,  1.,  0.,  0.],
           [ 0.,  0.,  0.,  0.,  1.]])
    

    【讨论】:

    • 仅供参考:要获取整数数组,请使用zero = np.zeros((4, 5), dtype=int)
    猜你喜欢
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    • 2021-12-03
    • 1970-01-01
    • 2020-07-06
    • 2020-06-22
    • 1970-01-01
    相关资源
    最近更新 更多