Numpy:合并多个切片的高效方法

12

我有一个numpy数组

test_array = np.arange(100).reshape((4,25))

我想要将以下列合并以形成一个新数组

1:3, 2:4, 3:15, 2:24, 6:8, 12:13

我知道这段代码会起作用

np.hstack((test_array[:,1:3],test_array[:,2:4],test_array[:,3:15],test_array[:,2:24],test_array[:,6:8],test_array[:,12:13]))

但是如果有更好的方式可以避免复制这么多“test_array”,类似于:

np.hstack((test_array[:,[1:3 2:4 3:15 2:24 6:8 12:13]]))

有一些方法可以使这个操作更易于阅读和编写,但不幸的是没有避免复制数据的方法。 - Nils Werner
看起来 np.r_ 是一个高效的方法来做这件事,就像在 MATLAB 中一样。 - FF0605
是的,这是一个不错的解决方案。我只是想让你知道它并不能避免复制。 - Nils Werner
谢谢Nils:) 实际上在我的代码中,“test_array”这个数组名称非常长,导致文本随处泛滥。 np.r帮助我整理了一下 :) - FF0605
你正在索引后连接切片,而 r_ 是在索引之前连接的。它们在速度上大致相等。 - hpaulj
1个回答

13
您可以使用np.r_来从您的切片创建相应的索引范围。它还可以一次接受多个切片。
In [25]: test_array[:, np.r_[1:3, 2:4, 3:15, 2:24, 6:8, 12:13]]
Out[25]: 
array([[ 1,  2,  2,  3,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14,  2,
         3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
        20, 21, 22, 23,  6,  7, 12],
       [26, 27, 27, 28, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 27,
        28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44,
        45, 46, 47, 48, 31, 32, 37],
       [51, 52, 52, 53, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 52,
        53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
        70, 71, 72, 73, 56, 57, 62],
       [76, 77, 77, 78, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 77,
        78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94,
        95, 96, 97, 98, 81, 82, 87]])

请注意,如在评论中所述,使用r_更易于阅读和编写,但无法避免复制数据。这是因为高级索引始终返回副本,而不像常规索引从数组返回视图。


1
需要注意的是,使用 r_ 更易于阅读和编写,但不能避免复制数据。 - Nils Werner
@NilsWerner 的确,感谢提醒! - Mazdak
@NilsWerner np.r_返回一个数组,因此这只是常规的切片。复制发生在哪里? - ayhan
@ayhan 复制意味着当您从数组中选择多个列时,它会返回复本而不是视图(对主数组的引用)。 - Mazdak
当我尝试使用test_array[:, np.r_[1:3, 2:4, 3:15, 2:24, 6:8, 12:13]] = 2时,它修改了原始数组,但我认为你的意思是当它被分配给一个变量时,它会创建一个副本(它确实如此)。谢谢。 - ayhan
1
@ayhan 对于混淆感到抱歉,我指的是复制数据而不是数组本身。在此处阅读更多信息:https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html#advanced-indexing - Mazdak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接