3

这是使用 numpy。这里有一些有趣的东西接近需要的东西;对子矩阵视图 d 的更新可以更新后备矩阵 a:

a = array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

print a

array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

d = a[1:4,1:4]

print d

array([[0, 1, 0],
[1, 0, 0],
[0, 0, 0]])

d[1,1]=9

print a

array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 9, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

太好了,9 出现在支持数组 a 中,正如我所希望的那样。

好的,问题来了——现在如果需要,将一个 numpy 子矩阵视图数组 d 或 d 的某个视图 dd 公式化为一维矩阵而不是二维矩阵,你怎么做?以下无法做到这一点。

dd = d.reshape(9)

print dd

array([0, 1, 0, 1, 9, 0, 0, 0, 0])

dd[7]=7

print dd

array([0, 1, 0, 1, 9, 0, 0, 7, 0])

print a

array([[0, 0, 0, 0, 0],
[0, 0, 1, 0, 0],
[0, 1, 9, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 0, 0]])

我曾希望看到 7 出现在支持数组 a 中。请注意,没有要求将 d 子矩阵视图限制为 2D - 如果存在这样的事情,则 d 子矩阵视图的一维定义首先将是一个完美的公式。

4

3 回答 3

3

如果您尝试创建视图,则应分配给.shape属性而不是调用.reshape. 如果您阅读numpy.reshape的注释部分,您会发现在不复制的情况下创建数组视图并不总是可能的。观察当我运行你的代码时会发生什么.shape

>>> import numpy as np
>>> a = np.array([[0, 0, 0, 0, 0],
... [0, 0, 1, 0, 0],
... [0, 1, 0, 0, 0],
... [0, 0, 0, 0, 0],
... [0, 0, 0, 0, 0]])
>>> d = a[1:4,1:4]
>>> d.shape
>>> d.shape = (9,)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: incompatible shape for a non-contiguous array

这不起作用的原因是您创建的视图切片不连续。如果 numpy 无法在其底层存储机制中有效地维护给定数据,则该.reshape函数会创建一个副本。

于 2012-08-12T15:13:36.003 回答
3

我想你可能会发现这个flat方法很有用。正如jterrace已经指出的那样,d使用的内存不是连续的,因此d不能以通常的方式进行重塑。但是,该flat方法不返回数组——它返回一个numpy.flatiter对象,有点像 python 迭代器,但允许索引访问和赋值,就像常规数组一样。

>>> d = a[1:4,1:4]
>>> dd = d.flat
>>> dd[7] = 7
>>> a
array([[0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0],
       [0, 1, 0, 0, 0],
       [0, 0, 7, 0, 0],
       [0, 0, 0, 0, 0]])
于 2012-08-12T16:26:34.247 回答
2

您遇到的问题是dd = d.reshape(9)- 正在创建 的副本d而不是重新塑造的视图d

尝试:

d = a[1:4, 1:4] # updates reflected in a
d[1, 1] = 9     # updates reflected in a
d.itemset(7, 7) # 7th element regardless of dimensions
# or for multiple updates
np.put(d, [7, 3], [7, 9999]) 
print a
于 2012-08-12T15:29:54.067 回答