对于最小的工作示例,让我们数字化2D数组.numpy.digitize需要一维数组:
import numpy as np
N = 200
A = np.random.random((N, N))
X = np.linspace(0, 1, 20)
print np.digitize(A.ravel(), X).reshape((N, N))
Run Code Online (Sandbox Code Playgroud)
现在文档说:
......只在需要时才制作副本.
ravel在这种情况下,如何知道副本是否"需要"?通常 - 有没有办法可以确定特定操作是创建副本还是视图?
我的印象是,在NumPy中,两个阵列可以共享相同的内存.请看以下示例:
import numpy as np
a=np.arange(27)
b=a.reshape((3,3,3))
a[0]=5000
print (b[0,0,0]) #5000
#Some tests:
a.data is b.data #False
a.data == b.data #True
c=np.arange(27)
c[0]=5000
a.data == c.data #True ( Same data, not same memory storage ), False positive
Run Code Online (Sandbox Code Playgroud)
所以显然b没有复制a; 它只是创建了一些新的元数据并将其附加到a正在使用的相同内存缓冲区中.有没有办法检查两个数组是否引用相同的内存缓冲区?
我的第一印象是使用a.data is b.data,但返回false.我能做的a.data == b.data,返回真,但我不认为检查,以确保a和b共享相同的内存缓冲区,只有内存块被引用a和引用的一个b具有相同的字节.
我想检查两个ndarray是否是相同底层ndarray的重叠视图.
要检查两个切片是否完全相同,我可以执行以下操作:
a.base is b.base and a.shape == b.shape and a.data == b.data
Run Code Online (Sandbox Code Playgroud)
缓冲区的比较似乎只在一个简单的情况下工作 - 任何人都可以告诉我它是否有效吗?
不幸的是,这不适用于重叠切片,我还没有弄清楚如何从缓冲区中提取其底层数据中的偏移量 - 也许有人可以帮我解决这个问题?
而且,说a和b是切片x,并且c是切片b.由于基础数据相同,我还想检测c和之间的重叠a.看起来我应该能够通过比较缓冲和形状......如果有人能告诉我具体如何,我将不胜感激.
我对在视图上操作的numpy reshape的结果感到困惑.在下面的q.flags中显示它不拥有数据,但q.base既不是x也不是y,那么它是什么?我很惊讶地看到q.strides是8,这意味着它每次在内存中移动8个字节时获得下一个元素(如果我理解正确的话).但是,如果x以外的数组都没有数据,则唯一的数据缓冲区来自x,它不允许通过移动8个字节来获取q的下一个元素.
In [99]: x = np.random.rand(4, 4)
In [100]: y = x.T
In [101]: q = y.reshape(16)
In [102]: q.base is y
Out[102]: False
In [103]: q.base is x
Out[103]: False
In [104]: y.flags
Out[104]:
C_CONTIGUOUS : False
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
In [105]: q.flags
Out[105]:
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : False
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
In [106]: q.strides
Out[106]: …Run Code Online (Sandbox Code Playgroud) 假设我有一个numpy数组a并b像这样创建:
a = np.arange(3)
b = a
Run Code Online (Sandbox Code Playgroud)
如果我现在改变b例如这样
b[0] = 100
Run Code Online (Sandbox Code Playgroud)
并打印a, b, 他们的ids 和.flags
print a
print a.flags
print b
print b.flags
print id(a)
print id(b)
Run Code Online (Sandbox Code Playgroud)
我得到
[100 1 2]
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : True
UPDATEIFCOPY : False
[100 1 2]
C_CONTIGUOUS : True
F_CONTIGUOUS : True
OWNDATA : True
WRITEABLE : True
ALIGNED : …Run Code Online (Sandbox Code Playgroud)