簡體   English   中英

Python numpy數組整數索引平面切片分配

[英]Python numpy array integer indexed flat slice assignment

正在嘗試numpy並發現這種奇怪的行為。 該代碼可以正常工作:

>>> a = np.array([[1, 2, 3], [4, 5, 6]])    
>>> a[:, 1].flat[:] = np.array([-1, -1])
>>> a 
array([[ 1, -1,  3],
       [ 4, -1,  6]])

但是為什么這段代碼不會更改為-1元素(0和2列)?

>>> a[:, [0, 2]].flat[:] = np.array([-1, -1])
>>> a 
array([[ 1, -1,  3],
       [ 4, -1,  6]])

以及如何編寫代碼,使其變成這樣的0和2列的-1元素?

UPD:在我的示例中必須使用flat或smt類似

UPD2:我根據以下代碼制作了有問題的示例:

img = imread(img_name)
xor_mask = np.zeros_like(img, dtype=np.bool)
# msg_bits looks like array([ True, False, False, ..., False, False,  True], dtype=bool)
xor_mask[:, :, channel].flat[:len(msg_bits)] = np.ones_like(msg_bits, dtype=np.bool)

在使用channel == 0或1或2代碼分配給xor掩碼后,可以正常工作,但是如果channel == [1,2]或smt這樣,則不會發生分配

在第一個示例中,通過展平切片不會改變形狀,實際上 python Numpy不會創建新對象。 因此,分配給扁平化切片就像分配給實際切片一樣。 但是通過展平2D數組,您可以更改形狀,因此numpy會復制它。

同樣,您也不需要展平切片以添加到其中:

In [5]: a[:, [0, 2]] += 100

In [6]: a
Out[6]: 
array([[101,   2, 103],
       [104,   5, 106]])

正如其他人指出的那樣, .flat可能會創建原始矢量的副本,因此對它的任何更新都將丟失。 但是,對1D切片進行flat很好,因此您可以使用for循環更新多個索引。

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6]])
a[:, 1].flat = np.array([-1, -1])
print a

# Use for loop to avoid copies
for idx in [0, 2]:
     a[:, idx].flat = np.array([-1, -1])
print a

請注意,您不需要使用flat[:] :僅使用flat就足夠了(並且可能更有效)。

您只需from a[:, [0, 2]].flat[:] += 100刪除flat[:]

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> a[:, 1].flat[:] += 100
>>> a
array([[  1, 102,   3],
       [  4, 105,   6]])
>>> a[:, [0, 2]] += 100
>>> a
array([[101, 102, 103],
       [104, 105, 106]])

但是您說這是有必要的...您能不能只是reshape要添加到初始數組的內容,而不是使用flat

第二個索引調用復制數組,而第一個返回對該數組的引用:

>>> import numpy as np
>>> a = np.array([[1, 2, 3], [4, 5, 6]])
>>> b = a[:,1].flat
>>> b[0] += 100
>>> a
array([[  1, 102,   3],
       [  4,   5,   6]])
>>> b =a[:,[0,2]].flat
>>> b[0]
1
>>> b[0] += 100
>>> a
array([[  1, 102,   3],
       [  4,   5,   6]])
>>> b[:]
array([101,   3,   4,   6])

似乎當您希望以flat方式迭代的元素不相鄰時,numpy會在數組副本上進行迭代。

暫無
暫無

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

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