gpt4 book ai didi

python - 使用索引替换二维 numpy 数组的一部分

转载 作者:行者123 更新时间:2023-11-28 16:36:42 25 4
gpt4 key购买 nike

我正在尝试将名为“S”的二维 numpy 数组的一部分替换为 i 和 j 的函数。给定 S 为:

>>> S
Out[1]:
array([[ 1., 0., 0.],
[ 0., 3., 0.],
[ 0., 0., 9.]]

对于 i= 0 和 j= 1,我可以使用以下语法访问元素行 i 和 j 以及列 i 和 j:

>>> S[:, [i, j]][[i, j], :]
Out[2]:
array([[ 1., 0.],
[ 0., 3.]])

现在,当我尝试用另一个相同维度的数组 (tmp_arr) 替换数组 S 的相同元素时,python 不会给出错误,但它也不会执行任何操作,这意味着 S 的元素保持不变并且没有错误消息显示。

>>> tmp_arr
Out[3]:
array([[ 555., 0.],
[ 0., 555.]])

>>> S[:, [i, j]][[i, j], :] = tmp_arr

我得到的是同一个矩阵:

>>> S
Out[4]:
array([[ 1., 0., 0.],
[ 0., 3., 0.],
[ 0., 0., 9.]])

显然以下方法可行,但我正在寻找一个优雅的解决方案:

S[i, i] = tmp_arr[0, 0]
S[i, j] = tmp_arr[0, 1]
S[j, i] = tmp_arr[1, 0]
S[j, j] = tmp_arr[1, 1]

感谢您的评论和体验。

最佳答案

你可以使用 np.ix_构建所需的索引数组:

In [91]: S[np.ix_([i,j],[i,j])]
Out[91]:
array([[1, 0],
[0, 3]])

In [92]: tmp_arr = np.eye(2)*555

In [93]: tmp_arr
Out[93]:
array([[ 555., 0.],
[ 0., 555.]])

In [94]: S[np.ix_([i,j],[i,j])] = tmp_arr

In [95]: S
Out[95]:
array([[555, 0, 0],
[ 0, 555, 0],
[ 0, 0, 9]])

使用 np.ix_ 很适合对 S 进行赋值,但请注意,有更快的方法来选择子数组:

In [99]: %timeit S.take([i, j], axis=1).take([i, j], axis=0)
100000 loops, best of 3: 3.32 µs per loop
In [97]: %timeit S[:, [i, j]][[i, j], :]
100000 loops, best of 3: 8.8 µs per loop
In [96]: %timeit S[np.ix_([i,j],[i,j])]
100000 loops, best of 3: 13 µs per loop

但与这些其他方法不同,S[np.ix_(...)] = ... 不使用链式索引,因此S。 __setitem__ 被调用并且分配影响 S。相反,S[:, [i, j]] 返回 S 子数组的副本,因此分配给 S [:, [i, j]][[i, j], :] 只影响子数组的这个副本,而不影响 S 本身。由于没有维护子数组的这个副本的引用,Python 在赋值完成后丢弃了副本,因此赋值丢失了。这就是为什么链式索引不适合分配给 S

关于python - 使用索引替换二维 numpy 数组的一部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25192270/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com