【问题标题】:Numpy array - stack multiple columns at the end of an array as rows using reshapeNumpy 数组 - 使用 reshape 将数组末尾的多列堆叠为行
【发布时间】:2021-02-03 06:23:48
【问题描述】:

我想将n 的列数堆叠为数组末尾的新行。我试图通过重塑来做到这一点,但我做不到。例如给定表格

table = np.array([[11,12,13,14,15,16],
                  [21,22,23,24,25,26],
                  [31,32,33,34,35,36],
                  [41,42,43,44,45,46]])

如果n=2 应该是我的输出:

array([[11, 12], 
       [21, 22], 
       [31, 32], 
       [41, 42], 
       [13, 14], 
       [23, 24], 
       [33, 34], 
       [43, 44], 
       [15, 16], 
       [25, 26], 
       [35, 36], 
       [45, 46]])

如果n=3:

array([[11, 12, 13], 
       [21, 22, 23], 
       [31, 32, 33], 
       [41, 42, 43], 
       [14, 15, 16], 
       [24, 25. 26], 
       [34, 35, 36], 
       [44, 45, 46]])

更新:

好的,我设法通过以下命令实现了我想要的结果:

import numpy as np

n=2
np.concatenate(np.split(table, table.shape[1]/n, axis=1), axis=0)
n=3
np.concatenate(np.split(table, table.shape[1]/n, axis=1), axis=0)

我不知道是否可以通过重塑来完成。

【问题讨论】:

  • 判断arr1 是否可以重整为arr2 的最佳方法是检查arr1.flatten() 是否等于arr2.flatten()。显然不是你的情况。因此,如果您希望使用单个 reshape(...) 方法,则需要另外使用其他方法(在某些情况下可能会重复使用 reshape(..)
  • 好吧,一开始我试图弄清楚我是否可以使用该线程stackoverflow.com/questions/55444777/… 中的解决方案,他们也使用flatten(),但显然正如您提到的那样,这很可能是不可能的。
  • 好吧,至少你可以应用一些额外的方法,例如np.transposenp.squeezenp.swapaxis。您还将检查maxpooling 的一个很好的示例,它与您的问题非常接近。我会尽量适应你的问题。
  • 你可以使用 np.row_stack 代替连接:np.row_stack(np.split(table, table.shape[1]/n, axis=1))。不可否认,这样做的唯一好处是无需指定轴。这只是另一种潜在的使用途径。就个人而言,我认为没有必要在这里使用 reshape,你所拥有的就很好。
  • 是的,很可能你是对的。关键是我已将其与reshape 相关联,因为这是我想到的第一个使用命令,但正如你所说,我所拥有的可能已经足够好了。

标签: python numpy reshape


【解决方案1】:

OP 提供了一个解决方案:

np.concatenate(np.split(table, table.shape[1]/n, axis=1), axis=0)

这似乎效率低下,因为np.split 强制将数据更改为数组列表,然后在外部参数中对其进行迭代。更多 np.concatenate 也不是那么有效。当列表项的长度不平衡时,它们非常适合工作。

我的解决办法是这样的:

np.vstack(table.reshape(4,3,2).swapaxes(0,1))
#np.vstack(table.reshape(4,2,3).swapaxes(0,1)) #for second case

让我们检查一下我对性能的预测是否正确:

%timeit np.vstack(table.reshape(4,3,2).swapaxes(0,1))
%timeit np.concatenate(np.split(table, table.shape[1]/2, axis=1), axis=0)

输出:

22.4 µs ± 2.72 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
42.8 µs ± 9.09 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)

我在numpyviz 的协助下寻找解决方案(免责声明:我是它的作者)。有一个numpyvizualisation 有助于更好地理解流程:

一般来说,您需要设置一个形状,以便块保持宽度和高度。 Numpyvizualisation 暗示新形状的axis=0axis=2 分别对应于table.shape[0]n。中间轴的长度也是table.shape[1]\\n的块数。所以你可以像这样传递参数:

table.reshape(table.shape[0], table.shape[1]\\n, n)

或者更简单的方式:

table.reshape(table.shape[0], -1, n)

【讨论】:

  • 有趣的方法,感谢@mathfux。但是有一个问题,如果我认为我想要的分割n 值始终是我的第三个暗淡,那么你如何指定重塑中的前两个维度,例如reshape(x, y, n)reshape(x, y, n) 分别用于每个案例场景?顺便说一句,numpyviz 看起来很酷,干得不错。
  • @ttsesm 我注意到第三个数字的名称中有错字,希望更正并添加一些更新。在我的图中,reshape(x, y, n) 的参数对应于axis0axis1axis2 的长度。
  • 所以这意味着它们可以替换为reshape(table.shape[0], -1, n)?我要求这样才能进行概括。
  • @ttsesm 你是对的。这与我在更新的答案中发布的相同。
猜你喜欢
  • 2019-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多