Numpy矩阵通过副本修改

时间:2012-05-20 09:36:05

标签: python numpy

在带有numpy 1.5.1的python 2.7.1中:

import numpy as np

B = np.matrix([[-float('inf'), 0], [0., 1]])
print B
Bm = B[1:, :]
Bm[:, 1] = float('inf')
print B

返回

[[-inf   0.]
 [  0.   1.]]
[[-inf   0.]
 [  0.  inf]]

这是非常意外的,因为我认为Bm是副本(如this question中所示)。

任何帮助解决这个问题都将受到赞赏。

3 个答案:

答案 0 :(得分:5)

numpy中的

Basic slicing返回一个视图,而不是切片复制它们的Python列表。

但是,如果使用高级切片,切片将始终复制数据,就像连接或附加numpy数组一样。

比较

a = np.arange(16).reshape((4,4))
a_view = a[::2, ::3]  # basic slicing
a_copy = a[[0, 2], :]  # advanced

答案 1 :(得分:2)

在我的问题中,正在制作副本np.append。切片不会复制数组/矩阵。

您可以使用

制作Bm副本
Bm = B[1:, :].copy()

答案 2 :(得分:0)

从jorgeca的例子来看,这很有趣:

a = np.arange(16).reshape((4,4))
a_view = a[::2, ::3]  # basic slicing
a_copy = a[[0, 2], :]  # advanced

我的附加评论可能偏离主题,但令人惊讶的是以下两个

a[::2, ::3]+= 1  # basic slicing
a[[0, 2], :]+= 1 # advanced

会对a进行更改。