使用NumPy反转数组的一部分

4
我将使用数组切片来反转部分NumPy数组。例如,如果我的数组是:
a = np.array([1,2,3,4,5,6])

然后我就可以获得 b 的一个切片。
b = a[::-1]

这是关于原始数组的视图。我想要的是一个部分反转的视图,例如

1,4,3,2,5,6

如果不完全按照NumPy的设计来操作,我就会遇到性能问题,因此我想尽可能避免使用“花哨”的索引。

3个回答

11

如果您不喜欢off by one索引

>>> a = np.array([1,2,3,4,5,6])
>>> a[1:4] = a[1:4][::-1]
>>> a
array([1, 4, 3, 2, 5, 6])

这个双切片 a[1:4][::-1] 是正确的 Pythonic 方式吗?还是有一种使用单个切片的解决方案?难道不能通过 a[3:0:-1] 更简单地完成吗? - undefined
@Walter,是的,这就是John Zwinck的回答所做的,但对于读者来说,不太清楚选择了哪些元素。 - undefined

5
>>> a = np.array([1,2,3,4,5,6])
>>> a[1:4] = a[3:0:-1]
>>> a
array([1, 4, 3, 2, 5, 6])

1

你可以使用置换矩阵(这是部分反转数组的最佳方式)。

a = np.array([1,2,3,4,5,6])
new_order_for_index = [1,4,3,2,5,6] # Careful: index from 1 to n !

# Permutation matrix
m = np.zeros( (len(a),len(a)) )
for index , new_index  in enumerate(new_order_for_index ):
    m[index ,new_index -1] = 1

print np.dot(m,a)
# np.array([1,4,3,2,5,6])

你不能把代码放在for循环中,然后称之为最优解。 - Tatarize

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