簡體   English   中英

如何將numpy子矩陣視圖數組d表示為1D矩陣而不是2D

[英]How to formulate a numpy submatrix view array d as a 1D matrix rather than a 2D

這是使用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出現在支持陣列中,正如我所希望的那樣。

好了,這就是摩擦 - 現在如果要求是,要制定一個numpy子矩陣視圖數組d,或者d的一些視圖dd,作為一維矩陣而不是2D,你是如何做到的? 以下未能做到這一點。

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出現在支持陣列中。 請注意,沒有要求將d子矩陣視圖限制為2D - 如果存在這樣的事物,則首先對d子矩陣視圖的1D定義將是完美的公式。

如果您嘗試創建視圖,則應分配.shape屬性而不是調用.reshape 如果您閱讀numpy.reshape的Notes部分,您將看到並不總是可以在不復制的情況下創建數組視圖。 觀察使用.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函數會創建一個副本。

我想你可能會發現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]])

你的問題是, 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM