寻找一种可靠地识别numpy对象是否为视图的方法.
相关问题在此之前(这里,这里,这里)出现了很多次,人们提供了一些解决方案,但似乎都有问题:
pandas现在使用的测试是调用某个视图my_array.base is not None.这似乎总是捕捉到观点,但也提供了许多误报(即使它不是,它报告某些东西是一种观点的情况).numpy.may_share_memory() 将检查两个特定的数组,但不会回答一般
flags['OWNDATA'])被报道(第三评论第一个答案)在某些情况下失败.(我感兴趣的原因是我正在为大熊猫实施写时复制,而保守的指标导致过度复制.)
看来我的数据格式为NumPy数组列表(type() = np.ndarray):
[array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]]), array([[ 0.00353654]]), array([[ 0.00353654]]),
array([[ 0.00353654]])]
Run Code Online (Sandbox Code Playgroud)
我想把它变成一个polyfit函数:
m1 = np.polyfit(x, y, deg=2)
Run Code Online (Sandbox Code Playgroud)
但是,它返回错误: TypeError: expected 1D vector for x
我假设我需要将我的数据展平为:
[0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654, 0.00353654 ...]
Run Code Online (Sandbox Code Playgroud)
我已经尝试了列表理解,它通常适用于列表列表,但是这正如预期的那样无效:
[val for sublist in risks for val in sublist]
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?
我的印象是,在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具有相同的字节.
I am creating symmetric matrices/arrays in Python with NumPy, using a standard method:
x = rand(500,500)
x = (x+x.T)
all(x==x.T)
> True
Run Code Online (Sandbox Code Playgroud)
Now let's be clever:
x = rand(500,500)
x += x.T
all(x==x.T)
> False
Run Code Online (Sandbox Code Playgroud)
Wait, what?
x==x.T
> array([[ True, True, True, ..., False, False, False],
[ True, True, True, ..., False, False, False],
[ True, True, True, ..., False, False, False],
...,
[False, False, False, ..., True, True, True],
[False, False, False, ..., True, True, True],
[False, False, …Run Code Online (Sandbox Code Playgroud) 在文件中numpy.reshape,它说:
如果可能,这将是一个新的视图对象; 否则,它将是一份副本.注意,不保证返回数组的内存布局(C-或Fortran-连续).
我的问题是,numpy何时会选择返回一个新视图,何时复制整个数组?是否有任何一般原则告诉人们行为reshape,或者只是不可预测?谢谢.
我对在 Python 中复制 Numpy 数组的工作方式感到困惑。我从以下几点开始:
import numpy as np
p = np.array([1.0, 0.0, 1.0, 0.3])
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用以下三种方法制作 p 的“副本”:
q = p
q1 = p[:]
q2 = p.copy()
Run Code Online (Sandbox Code Playgroud)
现在我执行q1[2] = 0.2,然后检查 q、q1 和 q2 的值。我惊讶地发现 p、q 和 q1 都变成了array([1.0, 0.0, 0.2, 0.3]),而只有 q2 保持不变。我也曾经id()检查过所有四个变量(p、q、q1、q2)的地址,并且已经确认id(p) = id(q),但是id(q1) != id(p).
我的问题是,如果id(q1) != id(p),q1 的修改如何改变 p 和 q?谢谢!
我对在视图上操作的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) 假设我有两个数组,
import numpy as np
x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])
Run Code Online (Sandbox Code Playgroud)
获取新数组 的最快、最 Pythonic 等方式是什么,z其元素数量等于x.size * y.size,其中元素是(x_i, y_j)两个输入数组中每对元素的乘积。
换句话说,我正在寻找一个数组,z其中.z[k]x[i] * y[j]
一种简单但低效的方法如下:
z = np.empty(x.size * y.size)
counter = 0
for i in x:
for j in y:
z[counter] = i * j
counter += 1
Run Code Online (Sandbox Code Playgroud)
运行上面的代码可以看出,z在这个例子中是
In [3]: z
Out[3]:
array([ 5., 6., 7., 8., 10., 12., 14., 16., 15., 18., …Run Code Online (Sandbox Code Playgroud)