相关疑难解决方法(0)

Numpy,阵列没有自己的数据?

我尝试以resize这种方式在数组上使用:

a = np.array([1,2,3,4,5,6], dtype=np.uint8)
a.resize(4,2)
print a 
Run Code Online (Sandbox Code Playgroud)

输出是OK!(我的意思是没有错误).但是当我运行这段代码时:

a = np.array([1,2,3,4,5,6], dtype=np.uint8).reshape(2,3)
a.resize(4,2)
print a 
Run Code Online (Sandbox Code Playgroud)

它引起了一个错误,说, ValueError: cannot resize this array: it does not own its data

我的问题:为什么应用reshape数组的所有权后会改变?所有权授予谁!?在reshape不创建一个新的内存,它是在同一阵列存储器上执行它的操作!那么为什么所有权会发生变化?

我读了np.reshapendarray.resize doc,但我无法理解原因.我读过这篇文章.我可以ndarray.flags在应用该resize方法之前始终检查.

python numpy

16
推荐指数
1
解决办法
1万
查看次数

我可以强迫一个numpy ndarray获取其内存的所有权吗?

我有一个C函数mallocs()并填充浮点数的二维数组.它"返回"该地址和数组的大小.签名是

int get_array_c(float** addr, int* nrows, int* ncols);
Run Code Online (Sandbox Code Playgroud)

我想用Python调用它,所以我使用ctypes.

import ctypes
mylib = ctypes.cdll.LoadLibrary('mylib.so')
get_array_c = mylib.get_array_c
Run Code Online (Sandbox Code Playgroud)

我从未弄清楚如何使用ctypes指定参数类型.我倾向于为我正在使用的每个C函数编写一个python包装器,并确保我在包装器中获得正确的类型.浮点数组是按主列顺序排列的矩阵,我想把它作为numpy.ndarray.但它非常大,所以我想使用C函数分配的内存,而不是复制它.(我刚刚在StackOverflow中找到了这个PyBuffer_FromMemory的答案:https://stackoverflow.com/a/4355701/3691 )

buffer_from_memory = ctypes.pythonapi.PyBuffer_FromMemory
buffer_from_memory.restype = ctypes.py_object

import numpy
def get_array_py():
    nrows = ctypes.c_int()
    ncols = ctypes.c_int()
    addr_ptr = ctypes.POINTER(ctypes.c_float)()
    get_array_c(ctypes.byref(addr_ptr), ctypes.byref(nrows), ctypes.byref(ncols))
    buf = buffer_from_memory(addr_ptr, 4 * nrows * ncols)
    return numpy.ndarray((nrows, ncols), dtype=numpy.float32, order='F',
                         buffer=buf)
Run Code Online (Sandbox Code Playgroud)

这似乎给了我一个具有正确值的数组.但我很确定这是一个内存泄漏.

>>> a = get_array_py()
>>> a.flags.owndata
False
Run Code Online (Sandbox Code Playgroud)

该阵列不拥有内存.很公平; 默认情况下,当从缓冲区创建数组时,它不应该.但在这种情况下它应该.删除numpy数组时,我真的很想让python为我释放缓冲区内存.似乎我可以强制将owndata强制为True,那应该这样做,但是owndata是不可设置的.

不满意的解决方案:

  1. 让get_array_py()的调用者负责释放内存.这太烦人了; 调用者应该能够像任何其他numpy数组一样处理这个numpy数组.

  2. 将原始数组复制到get_array_py中的新numpy数组(具有自己的独立内存),删除第一个数组,并释放get_array_py()中的内存.返回副本而不是原始数组.这很烦人,因为它应该是不必要的内存副本.

有办法做我想要的吗?我不能修改C函数本身,虽然我可以在库中添加另一个C函数,如果这有用的话.

c python free ctypes numpy

11
推荐指数
2
解决办法
2082
查看次数

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

请考虑以下代码:

import numpy as np
a = np.zeros(50)
a[10:20:2] = 1
b = c = a[10:40:4]
print b.flags  # You'll see that b and c are not C_CONTIGUOUS or F_CONTIGUOUS
Run Code Online (Sandbox Code Playgroud)

我的问题:

有没有办法(只有参考b)来制作bc连续?如果在此操作之后np.may_share_memory(b,a)返回,则完全正常False.

接近但不太合理的事情是: np.ascontiguousarray/ np.asfortranarray因为它们会返回一个阵列.


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

a = a[ix1:ix2,iy1:iy2,iz1:iz2]
Run Code Online (Sandbox Code Playgroud)

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

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

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

python numpy

6
推荐指数
2
解决办法
2382
查看次数

标签 统计

numpy ×3

python ×3

c ×1

ctypes ×1

free ×1