簡體   English   中英

在列表中使用切片numpy對象

[英]Use of slicing numpy object in a list

我在使用numpy切片時遇到問題。 我什至不知道如何給這個問題起一個名字或標題。

以下是一段測試代碼。

import numpy
input_items = []
output_items = []
input_items.insert(0,  numpy.array([1, 2, 3], dtype=numpy.float32))
output_items.insert(0,  numpy.array([0, 0, 0], dtype=numpy.float32))
in0 = input_items[0]
out = output_items[0]

print "Before, input_items[0] : {0}".format(input_items[0])
print "Before, output_items[0]: {0}".format(output_items[0])
out[:] = in0 * 2 
#out = in0 * 2
print "After, input_item[0]  : {0}".format(input_items[0])
print "After, output_item[0] : {0}".format(output_items[0])

如果我使用out[:] = in0 * 2 ,我將得到:

Before, input_items[0] : [ 1.  2.  3.]
Before, output_items[0]: [ 0.  0.  0.]
After, input_items[0]  : [ 1.  2.  3.]
After, output_items[0] : [ 2.  4.  6.]

如果使用out = in0 * 2 ,我將得到:

Before, input_items[0] : [ 1.  2.  3.]
Before, output_items[0]: [ 0.  0.  0.]
After, input_items[0]  : [ 1.  2.  3.]
After, output_items[0] : [ 0.  0.  0.]

在代碼中,我已將output_items[0]分配給out ,但是顯然使用outout[:]會影響output_items[0]的結果。 有人能弄清楚嗎?

謝謝。

說明

out[:] = in0 * 2更改原始數組,因為在numpy 切片中是原始數組的視圖 (不是副本) ,因此您可以獲取對其的引用並進行更改

out = in0 * 2不會更改任何原始數組,因為您只是將計算結果分配給out (結果存儲在新的單獨數組中),因此不是對output_itemsinput_items的引用

如果您需要復制一個數組,則可以使用numpy.copy() ,而不僅僅是分配out = output_items[0]如果您沒有復制就進行分配,則您仍在修改同一數組,這樣更改將反映在其他地方(例如, outoutput_items[0]

因此,例如,如果執行out = output_items[0].copy() ,則out會從output_items[0]的值復制一個新的新數組,但不會影響它

參考http://docs.scipy.org/doc/numpy/reference/generated/numpy.copy.html

暫無
暫無

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

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