小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

python – 比較NumPy對象引用

 印度阿三17 2019-06-27

我想了解NumPy的行為.

當我嘗試獲取NumPy數(shù)組的內(nèi)部數(shù)組的引用,然后將其與對象本身進行比較時,我得到返回值False.

這是一個例子:

In [198]: x = np.array([[1,2,3], [4,5,6]])
In [201]: x0 = x[0]
In [202]: x0 is x[0]
Out[202]: False

另一方面,對于Python本機對象,返回的是True.

In [205]: c = [[1,2,3],[1]]    
In [206]: c0 = c[0]    
In [207]: c0 is c[0]
Out[207]: True

我的問題是,NumPy的預期行為是什么?如果是這樣,如果我想創(chuàng)建NumPy數(shù)組的內(nèi)部對象的引用,我該怎么辦.

解決方法:

2d切片

當我第一次寫這篇文章時,我構建并索引了一個1d數(shù)組.但是OP正在使用2d數(shù)組,所以x [0]是’row’,是原始的一部分.

In [81]: arr = np.array([[1,2,3], [4,5,6]])
In [82]: arr.__array_interface__['data']
Out[82]: (181595128, False)

In [83]: x0 = arr[0,:]
In [84]: x0.__array_interface__['data']
Out[84]: (181595128, False)        # same databuffer pointer
In [85]: id(x0)
Out[85]: 2886887088
In [86]: x1 = arr[0,:]             # another slice, different id
In [87]: x1.__array_interface__['data']
Out[87]: (181595128, False)
In [88]: id(x1)
Out[88]: 2886888888

我之前寫的關于切片的內(nèi)容仍然適用.索引單個元素,與arr [0,0]一樣,與1d數(shù)組的工作方式相同.

這個2d arr與1d arr.ravel()具有相同的數(shù)據(jù)緩沖區(qū);形狀和步幅不同.而視圖,副本和項目之間的區(qū)別仍然適用.

在C中實現(xiàn)2d數(shù)組的常用方法是使用指向其他數(shù)組的指針數(shù)組. numpy采用不同的,跨步的方法,只有一個平面數(shù)據(jù)陣列,并使用形狀和步長參數(shù)來實現(xiàn)橫向.因此,子陣列需要自己的形狀和步幅以及指向共享數(shù)據(jù)緩沖區(qū)的指針.

1d數(shù)組索引

我將嘗試說明索引數(shù)組時發(fā)生的事情:

In [51]: arr = np.arange(4)

該數(shù)組是具有各種屬性(如形狀)和數(shù)據(jù)緩沖區(qū)的對象.緩沖區(qū)將數(shù)據(jù)存儲為字節(jié)(在C數(shù)組中),而不是Python數(shù)字對象.您可以在以下位置查看有關陣列的信息:

In [52]: np.info(arr)
class:  ndarray
shape:  (4,)
strides:  (4,)
itemsize:  4
aligned:  True
contiguous:  True
fortran:  True
data pointer: 0xa84f8d8
byteorder:  little
byteswap:  False
type: int32

要么

In [53]: arr.__array_interface__
Out[53]: 
{'data': (176486616, False),
 'descr': [('', '<i4')],
 'shape': (4,),
 'strides': None,
 'typestr': '<i4',
 'version': 3}

一個數(shù)據(jù)指針為十六進制,另一個為十進制.我們通常不直接引用它.

如果我索引一個元素,我得到一個新對象:

In [54]: x1 = arr[1]
In [55]: type(x1)
Out[55]: numpy.int32
In [56]: x1.__array_interface__
Out[56]: 
{'__ref': array(1),
 'data': (181158400, False),
....}
In [57]: id(x1)
Out[57]: 2946170352

它具有數(shù)組的一些屬性,但不是全部.例如,您無法分配給它.另請注意,其“數(shù)據(jù)”值完全不同.

從同一個地方做另一個選擇 – 不同的id和不同的數(shù)據(jù):

In [58]: x2 = arr[1]
In [59]: id(x2)
Out[59]: 2946170336
In [60]: x2.__array_interface__['data']
Out[60]: (181143288, False)

此外,如果我此時更改數(shù)組,它不會影響先前的選擇:

In [61]: arr[1] = 10
In [62]: arr
Out[62]: array([ 0, 10,  2,  3])
In [63]: x1
Out[63]: 1

x1和x2沒有相同的id,因此與is不匹配,并且它們也不使用arr數(shù)據(jù)緩沖區(qū).沒有任何記錄表明這兩個變量都來自arr.

通過切片,可以獲得原始數(shù)組的視圖,

In [64]: y = arr[1:2]
In [65]: y.__array_interface__
Out[65]: 
{'data': (176486620, False),
 'descr': [('', '<i4')],
 'shape': (1,),
 ....}
In [66]: y
Out[66]: array([10])
In [67]: y[0]=4
In [68]: arr
Out[68]: array([0, 4, 2, 3])
In [69]: x1
Out[69]: 1

它的數(shù)據(jù)指針比arr大4個字節(jié) – 也就是說,它指向同一個緩沖區(qū),只是一個不同的位置.改變y確實改變了arr(但不是獨立的x1).

我甚至可以對這個項目進行0d視圖

In [71]: z = y.reshape(())
In [72]: z
Out[72]: array(4)
In [73]: z[...]=0
In [74]: arr
Out[74]: array([0, 0, 2, 3])

在Python代碼中,我們通常不使用這樣的對象.當我們使用c-api或cython時,可以直接訪問數(shù)據(jù)緩沖區(qū). nditer是一種迭代機制,可以像這樣使用0d對象(在Python或c-api中).在cython類型中,內(nèi)存視圖對于低級訪問特別有用.

http://cython./en/latest/src/userguide/memoryviews.html

https://docs./doc/numpy/reference/arrays.nditer.html

https://docs./doc/numpy/reference/c-api.iterator.html#c.NpyIter

elementwise ==

回應評論,Comparing NumPy object references

np.array([1]) == np.array([2]) will return array([False], dtype=bool)

==被定義為數(shù)組作為元素操作.它比較各個元素的值并返回匹配的布爾數(shù)組.

如果需要在標量上下文(例如if)中使用這種比較,則需要將其縮減為單個值,如np.all或np.any.

is測試比較對象id(不僅僅是numpy對象).它在實際編碼中的價值有限.我經(jīng)常在像None這樣的表達式中使用它,其中None是具有唯一id的對象,并且不能很好地使用相等測試.

來源:https://www./content-1-274001.html

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多