相关疑难解决方法(0)

numpy:如果numpy数组是可见的可靠(非保守)指标

寻找一种可靠地识别numpy对象是否为视图的方法.

相关问题在之前(这里,这里,这里)出现了很多次,人们提供了一些解决方案,但似乎都有问题:

  • pandas现在使用的测试是调用某个视图my_array.base is not None.这似乎总是捕捉到观点,但也提供了许多误报(即使它不是,它报告某些东西是一种观点的情况).
  • numpy.may_share_memory() 将检查两个特定的数组,但不会回答一般
    • (@RobertKurn说截至2012年是最好的工具 - 任何变化?)
  • flags['OWNDATA'])报道(第三评论第一个答案)在某些情况下失败.

(我感兴趣的原因是我正在为大熊猫实施写时复制,而保守的指标导致过度复制.)

python arrays numpy pandas

45
推荐指数
1
解决办法
934
查看次数

展平NumPy数组列表?

看来我的数据格式为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)

最好的方法是什么?

python arrays numpy list-comprehension

42
推荐指数
4
解决办法
3万
查看次数

有没有办法检查NumPy阵列是否共享相同的数据?

我的印象是,在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,返回真,但我不认为检查,以确保ab共享相同的内存缓冲区,只有内存块被引用a和引用的一个b具有相同的字节.

python numpy

38
推荐指数
4
解决办法
7440
查看次数

Unexpected result with += on NumPy arrays

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)

python arrays numpy

24
推荐指数
2
解决办法
854
查看次数

在numpy中flatten和ravel有什么区别?

Numpy v 1.9包含两个看似相同的功能: 'flatten''ravel'

有什么不同?什么时候我可以选择一个与另一个将2-D np.array转换为1-D?

numpy

22
推荐指数
1
解决办法
7314
查看次数

什么时候使用reshape()时会numpy复制数组

在文件中numpy.reshape,它说:

如果可能,这将是一个新的视图对象; 否则,它将是一份副本.注意,不保证返回数组的内存布局(C-或Fortran-连续).

我的问题是,numpy何时会选择返回一个新视图,何时复制整个数组?是否有任何一般原则告诉人们行为reshape,或者只是不可预测?谢谢.

python numpy

13
推荐指数
2
解决办法
3247
查看次数

在 numpy 中,q1 = p[:] 而不是 q1 = p,但是当我修改 q1 时 p 被修改了?

我对在 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?谢谢!

python numpy

8
推荐指数
2
解决办法
236
查看次数

Numpy重塑视图

我对在视图上操作的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)

python numpy reshape

5
推荐指数
1
解决办法
1240
查看次数

将一个数组的每个元素乘以另一个数组的每个元素

假设我有两个数组,

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)

python arrays numpy vectorization cartesian-product

5
推荐指数
2
解决办法
2万
查看次数