【问题标题】:Put numpy arrays split with np.split() back together将用 np.split() 拆分的 numpy 数组重新组合在一起
【发布时间】:2018-06-04 16:37:00
【问题描述】:

我已经像这样拆分了一个 numpy 数组:

x = np.random.randn(10,3)
x_split = np.split(x,5)

将 x 平均分成五个形状为 (2,3) 的 numpy 数组,并将它们放在一个列表中。将这些子集重新组合在一起的最佳方法是什么(例如x_split[:k]x_split[k+1:]),以便生成的形状类似于原始 x,即(某物,3)?

我发现对于 k > 0,你可以这样做:

np.vstack((np.vstack(x_split[:k]),np.vstack(x_split[k+1:])))

但这在 k = 0 as x_split[:0] = [] 时不起作用,因此必须有更好更清洁的方法。我在 k = 0 时收到的错误消息是:

ValueError: 需要至少一个数组来连接

【问题讨论】:

  • np.vstack(x_split[:k] + x_split[k+1:]) 呢?
  • k=0 案例作为特殊处理有什么问题。我们一直在进行这种边缘条件测试。不是吗?
  • @hpaulj 因为对我来说这个问题似乎很简单,以至于我认为我一定遗漏了一些明显的东西 - 请参阅 Paul Panzer 的评论和 Crazy Ivan 的回答

标签: python arrays numpy


【解决方案1】:

Paul Panzer 的评论是正确的,但由于 NumPy 现在是 gently discourages vstack,这里是 concatenate 版本:

x = np.random.randn(10, 3)
x_split = np.split(x, 5, axis=0)
k = 0
np.concatenate(x_split[:k] + x_split[k+1:], axis=0)

注意两次传递的显式轴参数(它必须相同);如果需要,这可以很容易地调整代码以适用于其他轴。例如,

x_split = np.split(x, 3, axis=1)
k = 0
np.concatenate(x_split[:k] + x_split[k+1:], axis=1)

【讨论】:

  • 专注于数组连接,很容易错过这个更简洁的列表连接选项。
【解决方案2】:

np.r_ 可以将多个切片转换为索引列表。

In [20]: np.r_[0:3, 4:5]                                                                                                
Out[20]: array([0, 1, 2, 4])                                                                                                                                                                                                                    
In [21]: np.vstack([xsp[i] for i in _])                                                                                 
Out[21]:                                                                                                                
    array([[9, 7, 5],                                                                                                              
           [6, 4, 3],                                                                                                              
           [9, 8, 0],                                                                                                              
           [1, 2, 2],                                                                                                              
           [3, 3, 0],                                                                                                               
           [8, 1, 4],                                                                                                               
           [2, 2, 5],                                                                                                              
           [4, 4, 5]])                                                                                                                                                                                                                              

In [22]: np.r_[0:0, 1:5]                                                                                                
Out[22]: array([1, 2, 3, 4])                                                                                                                                                                                                                    
In [23]: np.vstack([xsp[i] for i in _])                                                                                 
Out[23]:                                                                                                                
    array([[9, 8, 0],                                                                                                              
           [1, 2, 2],                                                                                                              
           [3, 3, 0],                                                                                                              
           [8, 1, 4],                                                                                                              
           [3, 2, 0],                                                                                                              
           [0, 3, 8],                                                                                                              
           [2, 2, 5],                                                                                                              
           [4, 4, 5]])   

np.r_ 内部有很多 if 和循环来处理切片及其边界,但它对我们隐藏了一切。

如果xsp(您的x_split)是一个数组,我们可以使用xsp[np.r_[...]],但由于它是一个列表,我们必须进行迭代。好吧,我们也可以使用 operator.itemgetter 对象隐藏该迭代。

In [26]: operator.itemgetter(*Out[22])
Out[26]: operator.itemgetter(1, 2, 3, 4)
In [27]: np.vstack(operator.itemgetter(*Out[22])(xsp))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多