gpt4 book ai didi

python-3.x - numpy 赋值不起作用

转载 作者:行者123 更新时间:2023-12-04 02:21:01 28 4
gpt4 key购买 nike

假设我有以下 numpy.array :

In[]: x
Out[]:
array([[1, 2, 3, 4, 5],
[5, 2, 4, 1, 5],
[6, 7, 2, 5, 1]], dtype=int16)


In[]: y
Out[]:
array([[-3, -4],
[-4, -1]], dtype=int16)

我想替换 x 的子数组来自 y并尝试了以下操作:
In[]: x[[0,2]][:,[1,3]]= y

理想情况下,我希望发生这种情况:
In[]: x
Out[]:
array([[1, -3, 3, -4, 5],
[5, 2, 4, 1, 5],
[6, -4, 2, -1, 1]], dtype=int16)

分配行没有给我任何错误,但是当我检查 x 的输出时
 In[]: x

我发现 x没有改变,即分配没有发生。

我怎样才能完成这个任务?为什么任务没有发生?

最佳答案

“花式索引”x[[0,2]][:,[1,3]]返回数据的副本。切片索引返回一个 View 。分配确实发生了,但是对于 x 的副本(实际上是...的副本的副本) .

在这里我们看到索引返回一个副本:

>>> x[[0,2]]
array([[1, 2, 3, 4, 5],
[6, 7, 2, 5, 1]], dtype=int16)
>>> x[[0,2]].base is x
False
>>> x[[0,2]][:, [1, 3]].base is x
False
>>>

现在您可以使用花式索引来设置数组值,但在嵌套索引时则不能。

您可以使用 np.ix_生成索引并执行分配:
>>> x[np.ix_([0, 2], [1, 3])]
array([[2, 4],
[7, 5]], dtype=int16)
>>> np.ix_([0, 2], [1, 3])
(array([[0],
[2]]), array([[1, 3]]))
>>> x[np.ix_([0, 2], [1, 3])] = y
>>> x
array([[ 1, -3, 3, -4, 5],
[ 5, 2, 4, 1, 5],
[ 6, -4, 2, -1, 1]], dtype=int16)
>>>

你也可以让它与广播花式索引一起工作(如果那是术语的话)但它并不漂亮
>>> x[[0, 2], np.array([1, 3])[..., None]] = y
>>> x
array([[ 1, -3, 3, -4, 5],
[ 5, 2, 4, 1, 5],
[ 6, -4, 2, -1, 1]], dtype=int16)

顺便说一下,还有一些 interesting discussion目前在 NumPy 讨论邮件列表上更好地支持“正交”索引,因此这在 future 可能会变得更容易。

关于python-3.x - numpy 赋值不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29545932/

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