python – numpy – 将非连续数据转换为适当的连续数据

python – numpy – 将非连续数据转换为适当的连续数据,第1张

概述请考虑以下代码: import numpy as npa = np.zeros(50)a[10:20:2] = 1b = c = a[10:40:4]print b.flags # You'll see that b and c are not C_CONTIGUOUS or F_CONTIGUOUS 我的问题: 有没有办法(只提到b)使b和c连续? 如果np.may_share_mem 请考虑以下代码:
import numpy as npa = np.zeros(50)a[10:20:2] = 1b = c = a[10:40:4]print b.flags  # You'll see that b and c are not C_CONTIGUOUS or F_CONTIGUOUS

我的问题:

有没有办法(只提到b)使b和c连续?
如果np.may_share_memory(b,a)在此 *** 作后返回False,则完全正常.

接近但不太合理的事情是:np.ascontiguousarray / np.asfortranarray,因为它们将返回一个新数组.

我的用例是我有一个非常大的3D字段存储在numpy.ndarray的子​​类中.为了节省内存,我想将这些字段切换到我实际感兴趣处理的域的部分:

a = a[ix1:ix2,iy1:iy2,iz1:iz2]

切片为子类比切片ndarray对象更受限制,但这应该有效并且它将“做正确的事情” – 附加在子类上的各种自定义元数据将按预期转换/保留.不幸的是,由于这会返回一个视图,numpy之后不会释放大数组,所以我实际上并没有在这里保存任何内存.

要完全清楚,我希望完成两件事:

>保留我的类实例上的元数据.切片会起作用,但我不确定其他形式的复制.
>使其成为可以自由地收集原始数组

解决方法 你可以在cython中做到这一点:
In [1]:%load_ext cythonmagicIn [2]:%%cythoncimport numpy as npnp.import_array()def to_c_contiguous(np.ndarray a):    cdef np.ndarray new    cdef int dim,i    new = a.copy()    dim = np.PyArray_NDIM(new)    for i in range(dim):        np.PyArray_STRIDES(a)[i] = np.PyArray_STRIDES(new)[i]    a.data = new.data    np.PyArray_UpdateFlags(a,np.NPY_C_CONTIGUOUS)    np.set_array_base(a,new)In [8]:import sysimport numpy as npa = np.random.rand(10,10,10)b = c = a[::2,1::3,2::4]d = a[::2,2::4]print sys.getrefcount(a)to_c_contiguous(b)print sys.getrefcount(a)print np.all(b==d)

输出是:

43True

to_c_contiguous(a)将创建a的c_contiguous副本,并将其作为a的基础.

在调用to_c_contiguous(b)之后,a的refcount减少,当a的refcount变为0时,它将被释放.

总结

以上是内存溢出为你收集整理的python – numpy – 将非连续数据转换为适当的连续数据全部内容,希望文章能够帮你解决python – numpy – 将非连续数据转换为适当的连续数据所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1206834.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存