- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我的previous question ,我学会了调整子类 ndarray
的大小。整洁的。不幸的是,当我尝试调整大小的数组是计算结果时,这不再有效:
import numpy as np
class Foo(np.ndarray):
def __new__(cls,shape,dtype=np.float32,buffer=None,offset=0,
strides=None,order=None):
return np.ndarray.__new__(cls,shape,dtype,buffer,offset,strides,order)
def __array_prepare__(self,output,context):
print output.flags['OWNDATA'],"PREPARE",type(output)
return np.ndarray.__array_prepare__(self,output,context)
def __array_wrap__(self,output,context=None):
print output.flags['OWNDATA'],"WRAP",type(output)
return np.ndarray.__array_wrap__(self,output,context)
a = Foo((32,))
#resizing a is no problem
a.resize((24,),refcheck=False)
b = Foo((32,))
c = Foo((32,))
d = b+c
#Cannot resize `d`
d.resize((24,),refcheck=False)
准确的输出(包括回溯)是:
True PREPARE <type 'numpy.ndarray'>
False WRAP <class '__main__.Foo'>
Traceback (most recent call last):
File "test.py", line 26, in <module>
d.resize((24,),refcheck=False)
ValueError: cannot resize this array: it does not own its data
我认为这是因为 numpy
创建了一个新的 ndarray
并将其传递给 __array_prepare__
。不过,在这个过程中的某个时刻,似乎“output
”数组获取 view-casted to my Foo
type ,尽管文档在这一点上似乎不是 100% 清楚/准确。无论如何,在 View 转换之后,输出不再拥有数据,因此无法就地 reshape (据我所知)。
有没有办法通过某种 numpy 巫术(__array_prepare__
、__array__
)等将数据的所有权转移到我的子类的实例?
最佳答案
这不是一个令人满意的答案,但它也不适合评论...您可以使用 ufunc 的 out
参数解决数据的所有权问题。一个愚蠢的例子:
>>> a = Foo((5,))
>>> b = Foo((5,))
>>> c = a + b # BAD
True PREPARE <type 'numpy.ndarray'>
False WRAP <class '__main__.Foo'>
>>> c.flags.owndata
False
>>> c = Foo((5,))
>>> c[:] = a + b # BETTER
True PREPARE <type 'numpy.ndarray'>
False WRAP <class '__main__.Foo'>
>>> c.flags.owndata
True
>>> np.add(a, b, out=c) # BEST
True PREPARE <class '__main__.Foo'>
True WRAP <class '__main__.Foo'>
Foo([ 1.37754085e-38, 1.68450356e-20, 6.91042737e-37,
1.74735556e-04, 1.48018885e+29], dtype=float32)
>>> c.flags.owndata
True
我认为上面的输出与 c[:] = a + b
一致大批。但是当您使用 out
参数时,这不应该发生。
由于您已经担心数学表达式中的中间存储,因此对它的处理方式进行微观管理可能并不是一件坏事。即替换
g = a + b + np.sqrt(d*d + e*e + f*f)
与
g = foo_like(d) # you'll need to write this function!
np.multiply(d, d, out=g)
g += e * e
g += f * f
np.sqrt(g, out=g)
g += b
g += a
可以为您节省一些中间内存,并让您拥有自己的数据。它确实把“可读性很重要”的口头禅抛到了窗外,但是……
关于python - 转让 numpy 数据的所有权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15424211/
有一种方法可以转移github中存储库的所有权,但是有没有一种方法可以完全转移组织的所有权? Github 目前拥有的是一种将多人添加到组织的所有者团队的方法。而且,首先创建组织的用户可以从团队中删除
所以我按照 https://support.google.com/googleplay/android-developer/answer/6230247?hl=en&ref_topic=16285 上
在我的previous question ,我学会了调整子类 ndarray 的大小。整洁的。不幸的是,当我尝试调整大小的数组是计算结果时,这不再有效: import numpy as np clas
根据 PEP-541现在可以声明废弃的 PyPI 项目。有人做过吗?联系谁?我试过 dist utils mail list以及提交 ticket in the support forum ,但至今没
这里的任何人都可以告诉我 iOS 和 Android 应用程序所有权的转移是否会更改访问该应用程序的 URL。我有一个客户,以前的开发人员为他们发布了应用程序,我建议他们应该获得自己的开发人员帐户,然
我正在尝试将应用程序转移到其他开发者帐户。在转移过程中,我遇到错误,指出应用程序包含存折权利。 应用程序不包含任何与存折相关的功能,但使用 Apple Pay。 存折权利有哪些?他们指的是 Apple
有人对 Regex 0.12 有一些经验吗? 此时,我们正在使用 Watson Explorer enterprise。因此我们必须构建一个 XSL 脚本,它可以检索回特定的元数据: 我们基本需要的模
我是一名优秀的程序员,十分优秀!