python - 交换 Numpy 数组的切片

标签 python multidimensional-array numpy swap

我喜欢 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/

相关文章:

javascript - 在 Bokeh 上将文件从服务器发送到客户端

python - Pandas: reshape 数据框

二维矩阵上的 c 程序每次都会崩溃

python - 绘制给定数据集的功率谱密度时需要 abs () 方法

python - Pandas - dataframe groupby - 如何获取多列的总和

python - 错误: [Errno 104] Connection reset by peer - dev server IE 9

r - 将 data.frame 转换为高维矩阵

java - 如何检查一个数组是否在另一个数组中?

python - 使用 numpy genfromtxt 从混合数据类型文件导入大整数

arrays - Numpy reshape 余数抛出错误