我喜欢 python 处理变量交换的方式:
a, b, = b, a
而且我也想使用此功能在数组之间交换值,不仅一次交换一个值,而且交换多个值(不使用临时变量)。这不是我所期望的(我希望第三维的两个条目都可以交换):
import numpy as np
a = np.random.randint(0, 10, (2, 3,3))
b = np.random.randint(0, 10, (2, 5,5))
# display before
a[:,0, 0]
b[:,0,0]
a[:,0,0], b[:, 0, 0] = b[:, 0, 0], a[:,0,0] #swap
# display after
a[:,0, 0]
b[:,0,0]
有人有想法吗?当然,我总是可以引入一个额外的变量,但我想知道是否有更优雅的方法来做到这一点。
最佳答案
Python 正确解释代码就像您使用了额外的变量一样,因此交换代码等同于:
t1 = b[:,0,0]
t2 = a[:,0,0]
a[:,0,0] = t1
b[:,0,0] = t2
但是,即使这个代码也不能正确地交换值!这是因为 Numpy slices不要急于复制数据,他们会创建现有数据的 View 。复制仅在分配切片时执行,但在交换时,没有中间缓冲区的副本会破坏您的数据。这就是为什么您不仅需要一个额外的变量,还需要一个额外的 numpy 缓冲区,而一般的 Python 语法对此一无所知。例如,这按预期工作:
t = np.copy(a[:,0,0])
a[:,0,0] = b[:,0,0]
b[:,0,0] = t
关于python - 交换 Numpy 数组的切片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14992182/