如何在不使用循环的情况下以某种方式重塑NumPy数组?

wh6knrhe  于 2022-11-10  发布在  其他
关注(0)|答案(3)|浏览(176)

我一直试图通过使用不超过一个循环,或者更好的是根本不使用循环来重塑Numty数组。但是在多次尝试使用np.reshape()和np.transpose()之后,我仍然不知道如何转换这样的数组:

array([[1,2,6,3,2,5],
      [9,4,7,3,2,6],
      [8,4,6,3,2,6],
      [9,5,0,4,5,2],
      [0,5,2,6,4,2],
      [8,6,2,5,7,4]])

转换成如下所示的数组:

[[1,2,9,4,8,4,0,5,8,6],
[6,3,7,3,6,3,0,4,2,6,2,5],
[2,5,2,6,2,6,5,2,4,2,7,4]]

我看到的模式是,


# original

[[x11, x12, x13, x14, x15, x16],          
[x21, x22, x23, x24, x25, x26],                 
[x31, x32, x33, x34, x35, x36],       
[x41, x42, x43, x44, x45, x46],          
[x51, x52, x53, x54, x55, x56],          
[x61, x62, x63, x64, x65, x66]]

# result

[[x11, x12, x21, x22, x31, x32, x41, x42, x51, x52, x61, x62],
[x13, x14, x23, x23, x33, x34, x43, x44, x53, x54, x63, x64],
[x15, x16, x25, x26, x35, x36, x45, x46, x55, x56, x65, x66]]

但我最大的问题是连接到如上所示的行,特别是使用矢量化而不是循环。但我甚至不能用One Loop做到这一点。我需要两个。
就像我说的,我尝试了很多东西。例如,我将原始数组重塑为

[[1,2]
[6,3],
[2,5],
[9,4],
[7,3],
[2,6]
[8,4],
[6,3],
[2,6]
[9,5],
[0,4],
[5,2],
[0,5],
[2,6],
[4,2],
[8,6],
[2,5],
[7,4]]

从那时起,我不知道如何使用行来获得所需的数组。
我还试图立即重塑数组以匹配所需的形状,但随后也很难使值与所需的结果匹配。

iszxjhcz

iszxjhcz1#

请注意,reshape不能更改数组中元素的顺序,只能更改步长。但是使用sliding_window_view非常简单。当然,我们只需要每隔一对列,因此是::window[1],最终您希望将列对作为一行,因此是reshape

window = (a.shape[0], 2)
c = np.lib.stride_tricks.sliding_window_view(a, window)[:, ::window[1], ...].reshape(-1, window[0]*window[1])
gzszwxb4

gzszwxb42#

如果我们知道数组的维度,我们可以使用一种简单的方法:

arr = np.array([[1,2,6,3,2,5],
[9,4,7,3,2,6],
[8,4,6,3,2,6],
[9,5,0,4,5,2],
[0,5,2,6,4,2],
[8,6,2,5,7,4]])

d1, d2= arr.shape
np.reshape(np.split(arr, d1//2,axis=1),(d1//2,d2*2))
vybvopom

vybvopom3#

有很多方法可以做到这一点,但直接重塑不是其中之一。在你的情况下,我会这样做


# let a be your input array

a = np.array( 
    [
    [1,2,6,3,2,5],
    [9,4,7,3,2,6],
    [8,4,6,3,2,6],
    [9,5,0,4,5,2],
    [0,5,2,6,4,2],
    [8,6,2,5,7,4]]
)

np.concatenate([a[:, :2] , a[:, 2:4], a[:, 4:]]).reshape(-1,12)

array([[1, 2, 9, 4, 8, 4, 9, 5, 0, 5, 8, 6],
       [6, 3, 7, 3, 6, 3, 0, 4, 2, 6, 2, 5],
       [2, 5, 2, 6, 2, 6, 5, 2, 4, 2, 7, 4]])

相关问题